某些背景信息:
我跟着tutorial on using NuGet without committing packages取得了一些成功。通过为nuget.targets文件手动添加<RestorePackages>
和<Import ...>
来解决this NuGet issue后,一切正常。
但是,一旦我使用Mercurial克隆了存储库,构建时出现以下错误:
无法找到'C:\ ... \ Visual Studio 2010 \ Projects \ MyProject \ .nuget \ nuget.exe'
这是有道理的,因为我的忽略模式阻止我检查exe文件。从this related SO question我推断出这个文件在版本控制中是不常见的(或者是吗?),但实际上我不想将NuGet.exe提交到版本控制如果我可以帮助它。
问题: 是否有方便的方法来阻止需要检入NuGet.exe?
我尝试了一些谷歌,浏览文档,摆弄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元素中的false
更改为true
,但这没有按预期工作(有或没有条件属性)。
答案 0 :(得分:120)
刚刚检查过:nuget.targets是一个msbuild文件。你是在正确的方式,在:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
将值更改为true:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
但您必须重新启动Visual Studio或重新加载解决方案(请参阅注释),然后才能生效。
答案 1 :(得分:12)
查看该.targets
文件,如果您既不想检查NuGet.exe
,也不想每次都下载它,还有另一种方法可以执行此操作。关键是:
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
遵循仅在尚未定义属性的情况下设置属性的MSBuild约定,此值默认为解决方案的NuGet.exe
本地副本,如果DownloadNuGetExe
属性为true
则将其下载}。但是环境变量可以覆盖MSBuild属性。
如果您已将NuGet下载到某个中心位置,则可以将DownloadNuGetExe
保留在false
并定义一个名为NUGETEXEPATH
的环境变量,该变量将替代使用。
答案 2 :(得分:-1)