2012-04-15 9 views
3

NuGetパッケージを介して存在するファイルの内容を変更することはできますか?意味、あなたが新しいMVC3ウェブサイトを作ったとしましょう。ホームページを更新するNuGetパッケージをインストールしたいとします。おそらくウェルカムメッセージを変更し、作成したいくつかの新しいビューを含むようにレイアウトを変更し、新しいViewを返すメソッドを含むようにHome Controllerを更新してください。これはどのようにして行われますか?NuGetパッケージ経由で既存のファイルをどのように変更しますか?

答えて

4

NuGetパッケージをインストールしたら、必要なファイルを手動で変更できます。 VSで(または別のエディタで)編集してください。 NuGetパッケージに関する唯一の違いは、元のパッケージファイルとファイルの間で変更が検出されたときにパッケージをアンインストール/更新すると、変更されたファイルが削除されないことです。これがログであることに言及する予定です。

更新:

NuGetは.transform and .pp filesを介してパッケージのインストール時にプロジェクトファイルを変更するためのサポートを持っています。しかし、これには制限があります.transformファイルは設定ファイルに内容を追加します(編集できません).ppファイルは新しいソースコードファイル用です。

PowerShell(つまりinstall.ps1)でEnvDte CodeModelを使用すると、既存のソースコードを変更できます。それはもう少し複雑です。

+0

私が何を意味するかはかなりありません。私は、インストール自体を介してファイルを変更できますか?たとえば、NuGetパッケージ内のweb.configを変更できると聞きました。いくつかの指令やスクリプトなどがありますか?私はあなたがスクリプトを介して任意のファイルを変更することができると思いますが、それを行ういくつかの典型的な方法はありますか?したがって、パッケージをインストールすると、いくつかの新しいファイルが追加されますが、既存のファイルの一部が変更されます。たとえば、default.aspxの内容を変更するなどです。私の意味はまだ分かっていますか? – vbullinger

+1

今、私は上記の私の答えを更新しました。短いナゲットでは、.pp/.transformファイルの一般的な単純なシナリオをサポートするために焼き付けられています。既存のコードを変更することはNuGetではサポートされておらず、PowerShellスクリプトを使用して行われます。私はCodeModelを見ていますが、簡単な例は見つかりませんでした。 –

+0

ファイルを持っていることが分かりました - 私はppだと思っています - 名前空間のようなものの代わりに変数を残し、プロジェクトファイルなどから取得しますが、どのようにEntity Frameworkパッケージを追加しますかweb.configノード?それはスクリプトですか? – vbullinger

2

NuGet Package ExplorerでJQuery NuGetパッケージを開く(またはパッケージを解凍する)と、install.ps1とcommon.ps1を見ると、自動的に_references.jsに行が追加される例が見えますJQuery用にJQuery APIがIntelliSenseに表示されるようにします。

しかし、はい、自動的にコード(特に人々が編集できるコード)を更新するのはかなり複雑なプロセスです。 JQueryの例では、正規表現を使用して更新する前に既存の参照を検索します。これは、既知の場所の特定のファイルに1行のコメントを追加/更新することです(また、それは単なるコメントなので間違っています)。

私は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

ありがとう!この種の仕事をするための非常に "Hello、World!" - yの例です。 – vbullinger

関連する問題