c# - 我可以让 NugetRestore 在 azure devops (TFS) 上与 build.cake 一起工作吗

标签 c# azure-devops nuget cakebuild

我正在尝试将构建任务从 TFS 提取到 cake 脚本,以便构建任务与代码一起进行版本控制。我已经成功地创建了一个脚本,用于对我的项目进行清理、NuGet 恢复、构建和运行单元测试。在本地一切正常。然而,在配置 TFS 以运行我的蛋糕脚本后,它一直失败并出现以下错误:

2019-07-24T11:30:58.0377820Z ##[error]Unable to find version '4.4.3' of package 'System.Data.SqlClient'.
2019-07-24T11:30:58.0385573Z ##[error]Unable to find version '11.0.1' of package 'Newtonsoft.Json'.
2019-07-24T11:30:58.0401542Z ##[error]An error occurred when executing task 'Restore-Nuget-Packages'.
2019-07-24T11:30:58.0449315Z ##[error]Error: One or more errors occurred.
2019-07-24T11:30:58.0450913Z ##[error]  NuGet: Process returned an error (exit code 1).
2019-07-24T11:30:58.0739069Z ##[error]System.Exception: Unexpected exit code 1 returned from tool Cake.exe

我尝试更改 Cake 任务设置以使用不同版本的 Nuget 和 feed url。目前,它们看起来像这样:

Nuget Exe 位置: https://dist.nuget.org/win-x86-commandline/latest/nuget.exe

工具提要网址: https://api.nuget.org/v3/index.json

我们确实有一个私有(private) nuget 主机,我已经尝试修改工具提要 url。但是,从日志来看,提要网址似乎没问题。

蛋糕输出:

Feeds used:
2019-07-24T11:30:55.7676783Z   C:\Users\{usr}\AppData\Local\NuGet\Cache
2019-07-24T11:30:55.7677002Z   C:\Users\{usr}\.nuget\packages\
2019-07-24T11:30:55.7677066Z   http://{ournugeturl}
2019-07-24T11:30:55.7677233Z   http://{ournugeturl2}
2019-07-24T11:30:55.7677301Z   http://{ournugeturl3}
2019-07-24T11:30:55.7677572Z   C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\

安装了其他 nuget 包,例如,

2019-07-24T11:30:55.7882050Z Restoring NuGet package Autofac.4.8.1.
2019-07-24T11:30:55.9806596Z Adding package 'Autofac.4.8.1' to folder 'd:\w1\3263\s\packages'

我什至在 Nuget-Restore 任务中将详细级别设置为 Detailed,但是,我无法找到问题所在。

来自 cake.build 的片段。

Task("Restore-Nuget-Packages")
    .IsDependentOn("Clean")
    .Does(() =>
    {
        NuGetRestore(solution, new NuGetRestoreSettings {
            Verbosity = NuGetVerbosity.Detailed,
        });
    });

我的 NuGet.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <packageSources>
    <add key="privaterepo1" value="http://privatenugetrepo/nuget/NTS" />
    <add key="privaterepo2" value="http://privatenugetrepo/Default" />
    <add key="nugetv3" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
  <packageRestore>
    <add key="enabled" value="True" />
  </packageRestore>
</configuration>

build.cake

#tool "nuget:?package=xunit.runner.console&version=2.4.1"

var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");

var solution = "./pathtosolution.sl";

////////////////////////////////////////////////
///// Clean the project packages
////////////////////////////////////////////////
Task("Clean")
    .Does(() => 
  {
        CleanDirectory("./packages");
    });

////////////////////////////////////////////////
///// Adds private Nuget feed links
////////////////////////////////////////////////
Task("Add-Private-NuGet-Feed")
    .Does(() =>
  {
    string[] sources = {
      "private-src1",
      "private-src2",
      "https://api.nuget.org/v3/index.json"
      };

    foreach(string feed in sources)
    {
      if (!NuGetHasSource(feed))
      {
        var accessToken = EnvironmentVariable("SYSTEM_ACCESSTOKEN")
                            ?? throw new Exception("VSTS System Access Token is required to setup Private NuGet Feed");
      Information($"Source {feed} is missing");
      NuGetAddSource($"MyCompany-NuGet {feed}", feed, new NuGetSourcesSettings
      {
        UserName = "VSTS",
        Password = accessToken,
    }
        );
      } else 
      {
        Information($"Source {feed} Exists");
      }
    }

  });

////////////////////////////////////////////////
///// Restores all nuget packages.
////////////////////////////////////////////////
Task("Restore-Nuget-Packages")
  .IsDependentOn("Add-Private-NuGet-Feed")
  .Does(() =>
  {
    var solutions = GetFiles("./**/*.sln");
    // Restore all NuGet packages.
    foreach(var solution in solutions)
    {
      Information(solution);
      Information("Restoring {0}", solution);
      var nugetRestoreSettings = new NuGetRestoreSettings {
    ConfigFile = new FilePath("./NuGet.Config"),
    //MSBuildVersion = NuGetMSBuildVersion.MSBuild15
};
      NuGetRestore(solution, nugetRestoreSettings);
    }
  });

////////////////////////////////////////////////
///// Runs DotNetCoreRestore
////////////////////////////////////////////////
Task("DotNetCoreRestore")
  .Does(() => 
  {
    DotNetCoreRestore(
      solution,
      new DotNetCoreRestoreSettings()
      {});
  });

////////////////////////////////////////////////
///// Runs unit tests.
////////////////////////////////////////////////
Task("xUnit")
  .IsDependentOn("Build")
    .Does(() =>
  {

     var projects = GetFiles("./*.Tests/**/*.Tests.csproj");
    foreach(var project in projects)
    {
      DotNetCoreTest(
      project.FullPath,
      new DotNetCoreTestSettings()
        {
        // Set configuration as passed by command line
        Configuration = configuration
        });
    }
  });

////////////////////////////////////////////////
///// Build
////////////////////////////////////////////////
Task("Build")
  .IsDependentOn("Clean")
  .IsDependentOn("Add-Private-Nuget-Feed")
  .IsDependentOn("DotNetCoreRestore")
  .IsDependentOn("Restore-Nuget-Packages")
  .Does(() =>
  {
    MSBuild(solution, new MSBuildSettings {
        ToolVersion = MSBuildToolVersion.VS2017});
  });

////////////////////////////////////////////////
///// The main task.
////////////////////////////////////////////////
Task("Default")
  .IsDependentOn("xUnit");

RunTarget(target);

最佳答案

已解决

通过用在构建服务器上调用 build.ps1 的 Powershell 脚本替换 TFS 中的 Cake 任务解决了我的问题。 TFS screenshot where CAKE is disabled and replaced with powershell script.

关于c# - 我可以让 NugetRestore 在 azure devops (TFS) 上与 build.cake 一起工作吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182696/

相关文章:

c# - 如何用递归方法替换内部 Foreach 循环

c# - 如何计算 x 高度,即 Font 对象的 ex?

c# - 什么在 NuGet 包中调用 Start() 方法(例如 :AspNet. ScriptManager.jQuery)

C# WebClient 返回损坏的非英语文本

azure - 在 Azure DevOps 中删除源分支时如何删除 Azure Static Web App 分支预览环境?

Azure CLI 无法从模板创建门户仪表板

visual-studio-2012 - 合并出错后找回丢失的代码

nuget - 无法通过 NuGet 添加 MVVM Light 库

c# - "The primary reference could not be resolved...."错误 - 我应该使用哪个包?

c# - Windows 8 RT 应用程序控件多次触发 Tapped 事件