73

一些上下文:
我已经按照使用 NuGet 的教程进行操作,但没有成功提交包。通过手动添加和为 nuget.targets 文件解决此 NuGet 问题后,一切正常。<RestorePackages><Import ...>

但是,一旦我使用 Mercurial 克隆了存储库,构建时出现以下错误:

找不到“C:\...\Visual Studio 2010\Projects\MyProject\.nuget\nuget.exe”

这是有道理的,因为我的忽略模式阻止了我签入 exe 文件。从这个相关的 SO 问题中,我推断在版本控制中包含这个文件并不少见(或者是吗?),但如果我能提供帮助,我真的不希望将 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,但这并没有按预期工作(有或没有条件属性)。

4

3 回答 3

123

刚刚检查:nuget.targets 是一个 msbuild 文件。你走对了,在:

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

将值更改为 true:

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

但是您必须在此之后重新启动 Visual Studio 或重新加载解决方案(请参阅注释)才能生效。

于 2012-08-19T10:14:51.640 回答
12

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

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

遵循仅在尚未定义属性时才设置属性的 MSBuild 约定,此值默认为解决方案的本地副本,如果属性为NuGet.exe,则下载它。但是 MSBuild 属性可以被环境变量覆盖。DownloadNuGetExetrue

如果您已经将 NuGet 下载到某个中心位置,则可以离开DownloadNuGetExefalse定义一个名为 的环境变量NUGETEXEPATH,它将被使用。

于 2012-11-22T12:46:13.610 回答
0

启用 NuGet 包还原 在此处输入图像描述

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

于 2015-10-13T13:19:10.377 回答