2012-04-15 83 views
3

是否可以更改通過NuGet包存在的文件的內容?意思是,假設你製作一個全新的MVC3網站。你想安裝一個NuGet包來更新主頁。也許可以更改歡迎消息,然後更改佈局以包含您創建的一些新視圖,並更新主控制器以包含返回新視圖的方法。這將如何完成?如何通過NuGet包安裝更改現有文件?

回答

4

安裝完NuGet包後,您可以手動修改任何您想要的文件。只需在VS中編輯它們(或使用其他編輯器)。 NuGet軟件包的唯一區別是,如果您在原始軟件包文件和文件之間檢測到更改時卸載/更新軟件包,則不會刪除您的已修改文件。這裏會提到這是日誌。

更新:

的NuGet已通過.transform and .pp files一個軟件包安裝期間修改項目文件的支持。但是這具有侷限性,.transform文件將內容添加到配置文件(它們不能編輯),而.pp文件用於新的源代碼文件。

您可以使用PowerShell中的EnvDte CodeModel(即install.ps1)修改現有源代碼。雖然這有點複雜。

+0

這並不完全是我的意思。我的意思是你可以通過安裝本身來更改文件嗎?例如,我聽說你可以在NuGet包中更改web.config。像,一些指令或腳本等?我想你可以通過腳本來改變任何文件,但是有沒有一些典型的方法來做到這一點?所以當你安裝一個軟件包時,你會添加一些新文件,但是你的一些現有文件會被修改。例如,可能會更改default.aspx的內容。讓我的意思呢? – vbullinger 2012-04-17 21:46:44

+1

現在明白了,我更新了上面的答案。簡而言之,nuget已經支持.pp/.transform文件中的常見簡單場景。 NuGet不支持修改現有代碼,並通過PowerShell腳本完成。我會看看CodeModel,但我找不到一個簡單的例子。 – 2012-04-18 18:20:36

+0

我看到了關於有文件的東西 - 我認爲pp - 你會留下變量而不是命名空間等東西,它會從項目文件等中獲取它,但是Entity Framework包如何添加web.config節點?它是否與腳本? – vbullinger 2012-04-19 23:15:55

2

如果您在NuGet包資源管理器中打開JQuery NuGet包(或只是解壓縮包)並查看install.ps1和common.ps1,則可以看到一個示例,它們會自動將一行添加到_references.js對於JQuery,以便JQuery API將顯示在IntelliSense中。

但是,這是一個相當複雜的過程來自動更新代碼(尤其是人們可以編輯的代碼)。 JQuery示例涉及使用正則表達式在更新之前查找現有引用,並且所有這些操作都是向已知位置中的特定文件添加/更新單行註釋(並且它不應該破壞構建出錯了,因爲它只是一個評論)。

我很想看到更多的例子,甚至是像OP的請求一樣的輔助函數庫。

下面是common.ps1一個功能:

function AddOrUpdate-Reference($scriptsFolderProjectItem, $fileNamePattern, $newFileName) { 
    try { 
     $referencesFileProjectItem = $scriptsFolderProjectItem.ProjectItems.Item("_references.js") 
    } 
    catch { 
     # _references.js file not found 
     return 
    } 

    if ($referencesFileProjectItem -eq $null) { 
     # _references.js file not found 
     return 
    } 

    $referencesFilePath = $referencesFileProjectItem.FileNames(1) 
    $referencesTempFilePath = Join-Path $env:TEMP "_references.tmp.js" 

    if ((Select-String $referencesFilePath -pattern $fileNamePattern).Length -eq 0) { 
     # File has no existing matching reference line 
     # Add the full reference line to the beginning of the file 
     "/// <reference path=""$newFileName"" />" | Add-Content $referencesTempFilePath -Encoding UTF8 
     Get-Content $referencesFilePath | Add-Content $referencesTempFilePath 
    } 
    else { 
     # Loop through file and replace old file name with new file name 
     Get-Content $referencesFilePath | ForEach-Object { $_ -replace $fileNamePattern, $newFileName } > $referencesTempFilePath 
    } 

    # Copy over the new _references.js file 
    Copy-Item $referencesTempFilePath $referencesFilePath -Force 
    Remove-Item $referencesTempFilePath -Force 
} 
+0

謝謝!一個非常「你好,世界!」 - 一個例子來開展這種任務。 – vbullinger 2014-03-24 14:18:42