TFS和本地构建差异

时间:2014-10-21 17:40:36

标签: tfs

在我们的解决方案中,我们有一个“.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的本地副本?我确定它与构建变量或其他一些东西有关。

任何建议都将不胜感激。

2 个答案:

答案 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;