在我们的解决方案中,我们有一个“.nuget”文件夹。此文件夹不包含NuGet.exe。相反,我们始终确保在构建时使用NuGet.targets中的此属性下载最新的NuGet.exe:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
这在开发人员的计算机上非常有用。始终下载最新版本的NuGet.exe。
不幸的是,TFS Build Server存在问题 - 出于安全原因(并且不受控制),它无法访问Internet,因此无法根据需要下载NuGet.exe。相反,它有一个我们必须使用的NuGet.exe的本地副本(服务器本地)。
接下来的问题是,如何告诉Visual Studio Build System始终从Internet检索NuGet.exe并告诉TFS Build系统使用NuGet.exe的本地副本?我确定它与构建变量或其他一些东西有关。
任何建议都将不胜感激。
答案 0 :(得分:1)
要执行此操作,您需要将Nuget.exe检入.Nuget文件夹。然后,本地工作区和构建服务器都可以访问并使用相同的版本。
当您需要更新NuGet时,Visual Studio会通知您。
注意:在构建服务器上没有Internet访问权限不是安全限制。从IT的黑暗时代开始,这是一项严苛的政策,需要重新考虑。理想情况下,您不希望将任何二进制资产检入SCM,而是在构建时下载它们。
这是最佳做法,您的IT政策正在迫使您出现功能障碍。
答案 1 :(得分:0)
答案,至少我的回答,结果很简单。
&#34; .nuget&#34;文件夹包含&#34; NuGet.targets&#34;如果需要,下载NuGet.exe。有一个DownloadNuGet任务,其中包含一个C#代码片段,用于下载NuGet.exe。正如我之前所描述的,我们的TFS服务器无法访问Internet,因此该代码段始终会引发异常。
我的解决方案是在异常处理程序中添加一些代码,将NuGet.exe从服务器的知名位置复制到&#34; .nugget&#34;文件夹,它需要的位置。
使用此修改后的DownloadNuGet,NuGet.exe将在开发人员的计算机上下载,并将从TFS服务器上众所周知的位置提取。
以下是更新的DownloadNuGet任务,其中包含大量日志记录:
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<OutputFilename ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Reference Include="System.Core" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Using Namespace="System.Diagnostics" />
<Using Namespace="System.Net" />
<Using Namespace="Microsoft.Build.Framework" />
<Using Namespace="Microsoft.Build.Utilities" />
<Code Type="Fragment" Language="cs">
<![CDATA[
try {
OutputFilename = Path.GetFullPath(OutputFilename);
Log.LogMessage("***** Downloading latest version of NuGet.exe to: \"" + OutputFilename + '"');
WebClient webClient = new WebClient();
webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);
Log.LogMessage("***** Latest version of NuGet.exe was successfully downloaded: " + OutputFilename);
return true;
} catch (Exception ex) {
// This exception handling code is what's new.
Log.LogMessage("***** Exception while downloading latest versioln of NuGet.exe: " + ex.GetType() + " ==> " + ex.Message);
Log.LogMessage("***** Attempting to find NuGet.exe in C:\\NuGet folder.");
FileInfo nuGetExeFile = new FileInfo(@"C:\NuGet\NuGet.exe");
nuGetExeFile.CopyTo(OutputFilename, true);
String formattedFileLength = String.Format("{0:N0}", nuGetExeFile.Length);
Log.LogMessage("***** NuGet.exe has been copied to \"" + OutputFilename + "\", File size: " + formattedFileLength);
return true;
}
]]>
</Code>
</Task>
</UsingTask
&GT;