NuGet パッケージを介して存在するファイルの内容を変更することは可能ですか? つまり、まったく新しい MVC3 Web サイトを作成するとします。ホームページを更新する NuGet パッケージをインストールしたいと考えています。ウェルカム メッセージを変更し、レイアウトを変更して、作成した新しいビューを含め、ホーム コントローラーを更新して、新しいビューを返すメソッドを含めることができます。これはどのように行われますか?
2 に答える
NuGet パッケージをインストールしたら、必要なファイルを手動で変更できます。VS (または別のエディター) で編集するだけです。NuGet パッケージに関する唯一の違いは、元のパッケージ ファイルとファイルの間で変更が検出されるため、パッケージをアンインストールまたは更新しても、変更されたファイルは削除されないことです。これがログであるという言及があるでしょう。
アップデート:
NuGet は、 .transform および .pp ファイルを使用して、パッケージのインストール中にプロジェクト ファイルを変更することをサポートしています。ただし、これには制限があります。.transform ファイルは構成ファイルにコンテンツを追加しますが (編集できません)、.pp ファイルは新しいソース コード ファイル用です。
PowerShell でEnvDte CodeModelを使用して、既存のソース コードを変更できます(つまり、install.ps1)。ただし、もう少し複雑です。
NuGet パッケージ エクスプローラーで JQuery NuGet パッケージを開き (または単にパッケージを解凍)、install.ps1 と common.ps1 を見ると、JQuery の _references.js に行が自動的に追加される例を見ることができます。 JQuery API が IntelliSense に表示されます。
しかし、そうです、コード (特に人が編集できるコード) を自動的に更新するのはかなり複雑なプロセスです。JQuery の例では、既存の参照を更新する前に正規表現を使用して検索します。これは、既知の場所にある特定のファイルに 1 行のコメントを追加/更新するだけです (また、単なるコメントであるため、間違っています)。
OPのリクエストなどのヘルパー関数の例やライブラリをもっと見たいです。
common.ps1 の 1 つの関数を次に示します。
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
}