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


73

一些背景信息:
我已经按照使用NuGet教程进行操作,但是没有成功提交软件包。围绕工作后这个问题的NuGet通过手动添加<RestorePackages><Import ...>对nuget.targets文件事情工作。

但是,一旦使用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文件的工作原理,但这似乎与我要寻找的类似。随着我我的牛仔帽编码试图改变falsetrue在DownloadNuGetExe元素,但这并没有按预期方式工作(有或无的状态属性)。


您还可以删除.nuget文件夹并编辑项目文件,然后启动应用程序。
DmitryBoyko 2013年

Answers:


122

刚刚检查过:nuget.targets是一个msbuild文件。而且您在正确的方向上:

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

将值更改为true:

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

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


3
哦,我的上帝。不敢相信解决方案是重启VS!(为什么会这样呢?)多谢!
Jeroen

没问题。看来,VS不会跟踪链接到csproj文件的文件中的更改并且不要求重新加载。
Pavel Bakshy 2012年

7
您无需重新启动VS,只需重新加载解决方案即可重新读取项目。
anton.burger 2012年

@shambulator thx作为提示,我已经更新了答案,以便将来的访客可以轻松地找到该解决方案
Jeroen 2012年

2
Visual Studio使用非常积极的解决方案和项目文件缓存(以及/尤其是通过导入加载的msbuild项目文件)。更改msbuild文件时,可以立即从命令行对其进行测试,并在完成后重新加载相应的项目。 VS:
塞巴斯蒂安·金格尔

12

查看该.targets文件,如果您既不想签NuGet.exe入也不每次都下载它,则有另一种方法来执行此操作。关键是:

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

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

如果您已经将NuGet下载到某个中央位置,则可以DownloadNuGetExe在处false定义一个名为的环境变量NUGETEXEPATH,该变量将代替使用。


0

启用NuGet软件包还原 在此处输入图片说明

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


1
这并不能真正回答我的问题,对吗?在第一篇文章中我提到这个确切的指令包含太多,也就是我的问题,你可以假设我已经已经启用包恢复。我的问题是关于nuget.exe何时丢失它。
耶隆2015年

是的,打扰一下!我认为您需要为您的解决方案添加NuGet软件包
Mohammad Farahani
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.