避免将 NuGet.exe 添加到源代码管理中

一些背景:
我跟踪 使用不提交包的 NuGet 教程取得了一些成功。通过手动为 nuget.target 文件添加 <RestorePackages><Import ...>绕过 NuGet 的问题之后,一切正常。

但是,在使用 Mercurial 克隆了存储库之后,在构建时出现了以下错误:

无法定位“ C: ... Visual Studio 2010 Projects MyProject. nuget nuget.exe”

这是有道理的,因为忽略模式阻止我检入 exe 文件。从 这个相关的 SO 问题我推断,在版本控制中使用这个文件并不罕见(真的是这样吗?),但真的,我想 不要将 NuGet.exe 提交到版本控制,如果我能帮助它。


问题: 是否有一种方便的方法来避免需要检入 NuGet.exe?


我尝试了一些 Google-fu,浏览了一下文档,修改了一下 NuGet.target 文件,到目前为止还没有什么进展。如果我能够动态地指向构建解决方案的特定环境的 NuGet.exe,似乎会更好。

我知道我可以只添加 exe 文件,但我想知道是否有其他方法来处理这个问题,或者知道为什么没有可行的替代方案。

更新:
Target 文件包含一些相关的 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>

我不熟悉。目标文件,但这似乎符合我要找的东西。我戴上牛仔编码帽子,试着在 DownloadNuGetExe 元素中将 false改为 true,但是这并不能如预期的那样工作(不管是否带条件属性)。

35537 次浏览

刚刚检查过: nuget.target 是一个 msbuild 文件:

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

将值更改为 true:

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

但是你必须在这之后 重新启动 VisualStudio 或重新加载解决方案(请参阅注释)生效。

查看 .targets文件,如果您既不想签入 NuGet.exe,也不想每次都下载它,那么还有另一种方法可以做到这一点。关键是:

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

根据 MSBuild 的约定,如果尚未定义属性,则仅设置属性,该值默认为解决方案的 NuGet.exe本地副本,如果 DownloadNuGetExe属性为 true,则下载该值。但是 MSBuild 属性可以被环境变量覆盖。

如果你已经将 NuGet 下载到了某个中心位置,你可以将 DownloadNuGetExe保留在 false,定义一个名为 NUGETEXEPATH的环境变量,它将被替换使用。

启用 NuGet 包还原 enter image description here

右键单击解决方案,然后选择 启用 NuGet 包还原