web-dev-qa-db-ja.com

NuGet.exeをソース管理に追加する必要がなくなります

一部のコンテキスト:
私は パッケージをコミットせずにNuGetを使用するためのチュートリアル を順守し、ある程度成功しました。 このNuGetの問題 を回避した後、手動で<RestorePackages>および<Import ...> nuget.targetsファイルについては動作していました。

ただし、Mercurialでリポジトリを複製すると、ビルド時に次のエラーが発生しました。

「C:\ ...\Visual Studio 2010\Projects\MyProject\.nuget\nuget.exe」が見つかりません

これは理にかなっています。なぜなら、私の無視パターンにより、exeファイルをチェックインできなかったからです。 this related SO question このファイルがバージョン管理に含まれていることは珍しいことではないと推測しました(またはそうですか?)が、実際にしたいNuGet.exeをバージョン管理にコミットしないことをお勧めします


質問:チェックインの必要を防ぐ便利な方法はありますかNuGet.exe?


Google-fuをいくつか試し、ドキュメントをざっと読んで、NuGet.targetsファイルをいじってみましたが、今のところ運はありません。ソリューションを構築している特定の環境のNuGet.exeを動的に指すことができれば望ましいと思われます。

私はexeファイルを追加するだけでよいことを知っていますが、これを処理する他の方法があるかどうか、または実行可能な選択肢がない理由を知りたいと思います。

更新:
nuget.targetsファイルには、関連するいくつかのxmlが含まれています。

<!-- only (relevant) parts of the xml shown below -->
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
...
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <Task>
        <Code Type="Fragment" Language="cs">
        <![CDATA[
        try {
            OutputFilename = Path.GetFullPath(OutputFilename);

            Log.LogMessage("Downloading latest version of NuGet.exe...");
            WebClient webClient = new WebClient();
            webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

            return true;
        }
        catch (Exception ex) {
            Log.LogErrorFromException(ex);
            return false;
        }
        ]]>
        </Code>
    </task>
</UsingTask>

私は.targetsファイルの仕組みに慣れていませんが、これは私が探しているものの線に沿っているようです。カウボーイコーディングの帽子をかぶった状態で、DownloadNuGetExe要素のfalsetrueに変更しようとしましたが、これは期待どおりに機能しませんでした(条件属性の有無にかかわらず)。

71
Jeroen

確認済み:nuget.targetsはmsbuildファイルです。そして、あなたは正しい道を進んでいた:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>

値をtrueに変更します。

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

ただし、有効にするには、この後Visual Studioを再起動するか、ソリューションを再読み込み(コメントを参照)する必要があります。

120
Pavel Bakshy

その.targetsファイルを見て、NuGet.exeをチェックインしたり、毎回ダウンロードしたりしたくない場合は、これを行う別の方法があります。キーラインはこれです:

<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>

プロパティがまだ定義されていない場合にのみプロパティを設定するというMSBuildの規則に従って、この値はデフォルトでソリューションのローカルコピーNuGet.exeになり、DownloadNuGetExeプロパティがtrueの場合にダウンロードされます。ただし、MSBuildプロパティは環境変数によってオーバーライドできます。

すでに中央の場所にNuGetをダウンロードしている場合は、DownloadNuGetExefalseのままにして、代わりに使用されるNUGETEXEPATHという環境変数を定義できます。

12
shambulator