防止需要将NuGet.exe添加到源代码管理

Jer*_*oen 71 version-control visual-studio nuget

一些上下文:
我已经按照教程使用NuGet而没有提交包有一些成功.通过手动添加和为nuget.targets文件解决这个NuGet问题后,事情正在发挥作用.<RestorePackages><Import ...>

但是,一旦我用Mercurial克隆了存储库,我在构建时遇到以下错误:

无法找到'C:\ ...\Visual Studio 2010\Projects\MyProject\.nuget \nuget.exe'

这是有道理的,因为我的忽略模式阻止我检查exe文件.从这个相关的SO问题我推断出在版本控制中使用这个文件并不常见(或者是吗?),但是我真的不想将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>
Run Code Online (Sandbox Code Playgroud)

我不熟悉.targets文件的工作方式,但这似乎与我正在寻找的方式相符.随着我的牛仔编码帽子我试图改变falsetrue在DownloadNuGetExe元素,但如预期(有或无的状态属性),并没有工作.

Pav*_*shy 120

刚检查:nuget.targets是一个msbuild文件.你是在正确的方式,在:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
Run Code Online (Sandbox Code Playgroud)

将值更改为true:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
Run Code Online (Sandbox Code Playgroud)

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

  • 您无需重新启动VS,只需重新加载解决方案即可重新读取项目. (7认同)
  • 哦,我的主.不敢相信解决方案是重启VS!(无论如何,为什么会这样?)谢谢! (2认同)
  • Visual Studio使用*极其强大的解决方案和项目文件缓存(以及/尤其是通过导入加载的msbuild项目文件).更改msbuild文件时,可以立即从命令行测试它们,并在完成后重新加载相应的项目(s) )在VS中: (2认同)

sha*_*tor 12

查看该.targets文件,如果您既不想登记也不想NuGet.exe每次都下载,还有另一种方法可以执行此操作.关键是这样的:

<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
Run Code Online (Sandbox Code Playgroud)

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

如果你已经拥有的NuGet下载到一些中央位置,你可以离开DownloadNuGetExefalse,并定义称为一个环境变量NUGETEXEPATH,它会被替代.