4

NuGet パッケージを介して存在するファイルの内容を変更することは可能ですか? つまり、まったく新しい MVC3 Web サイトを作成するとします。ホームページを更新する NuGet パッケージをインストールしたいと考えています。ウェルカム メッセージを変更し、レイアウトを変更して、作成した新しいビューを含め、ホーム コントローラーを更新して、新しいビューを返すメソッドを含めることができます。これはどのように行われますか?

4

2 に答える 2

5

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

アップデート:

NuGet は、 .transform および .pp ファイルを使用して、パッケージのインストール中にプロジェクト ファイルを変更することをサポートしています。ただし、これには制限があります。.transform ファイルは構成ファイルにコンテンツを追加しますが (編集できません)、.pp ファイルは新しいソース コード ファイル用です。

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

于 2012-04-16T17:05:58.870 に答える
2

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
}
于 2014-03-21T20:19:46.440 に答える