11

我们正在使用 Cake Build 自动化我们的构建,我们使用来自 nuget.org 的 NuGet 包,但我们也有自己的 NuGet Feed 服务器,它具有用户名/密码身份验证来访问。我们如何使用带有身份验证的自定义 NuGet 提要服务器的 Cake Build?

4

1 回答 1

14

Cake 利用NuGet.exe安装工具、插件和 NuGet 别名。

除非您在#tool/#addin指令中指定了源或提供给 NuGet 别名,否则NuGet.exenuget.config在当前路径中查找并最终在当前用户全局设置 ( %AppData%\NuGet\NuGet.config) 中结束。

您有几个选择,如果您不想更改 Cake 文件或存储库中的任何内容,那么您可以在全局范围内为您的用户存储您的凭据,NuGet.exe并将选择这些示例:

nuget sources Update -Name [name of source] -Source [uri to your source] -UserName [your username] -Password [your password]

免责声明 dotnet CLI 的某些版本存在NuGet.exe加密密码问题,解决方法是添加-StorePasswordInClearText如下内容:

nuget sources Update -Name [name of source] -Source [uri to your source] -UserName [your username] -Password [your password] -StorePasswordInClearText

然后您的凭据以纯文本形式保存,这与您的凭据以纯文本形式保存的缺点一起使用。

您还可以通过为/指令和 NuGet 别名nuget.config指定特定源来覆盖设置。#tool#addin

#tool 指令

下面是一个示例来说明为#tool指令提供源

#tool "NUnit.ConsoleRunner"
or
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0

变成

#tool nuget:[source]?package=NUnit.ConsoleRunner
or
#tool nuget:[source]?package=NUnit.ConsoleRunner&version=3.4.0

即官方 V2 nuget 提要

#tool nuget:https://www.nuget.org/api/v2?package=NUnit.ConsoleRunner
or
#tool nuget:https://www.nuget.org/api/v2?package=NUnit.ConsoleRunner&version=3.4.0

#addin 指令

下面是一个示例来说明为#addin指令提供源

#addin "Cake.Slack"
or
#addin nuget:?package=Cake.Slack&version=0.4.0

变成

#addin nuget:[source]?package=Cake.Slack
or
#addin nuget:[source]?package=Cake.Slack&version=0.4.0

即官方 V2 nuget 提要

#addin nuget:https://www.nuget.org/api/v2?package=Cake.Slack
or
#addin nuget:https://www.nuget.org/api/v2?package=Cake.Slack&version=0.4.0

NuGet 别名

NuGet别名具有用于直接处理源的NuGetAddSourceNuGetHasSource等命令,例如,如果您希望在 NuGet 还原步骤之前将源添加到 CI 中,这些命令非常有用,如下所示:

var source = new {
                Name = EnvironmentVariable("PRIVATE_FEED_NAME"),
                Source = EnvironmentVariable("PRIVATE_FEED_SOURCE"),
                ApiUserName = EnvironmentVariable("PRIVATE_FEED_USERNAME"),
                ApiKey = EnvironmentVariable("PRIVATE_FEED_PASSWORD")
             };

if (!NuGetHasSource(source.SourceUrl))
{
    NuGetAddSource(
        source.Name,
        source.SourceUrl,
        new NuGetSourcesSettings {
            UserName = source.ApiUserName,
            Password = source.ApiKey
        }
    );
}

以上只会将源添加到您现有的nuget.config中,但您也可以覆盖NuGetInstallNuGetRestore别名的 NuGet 源。

NuGetInstall

NuGetInstall 别名具有采用NuGetInstallSettings工具设置类的重载,该类具有Source属性,您可以使用该属性覆盖使用的提要,例如:

NuGetInstall("MyNugetPackage", new NuGetInstallSettings {
    Source = new []{ "https://api.nuget.org/v3/index.json" }
});

NuGetRestore

类似地,NuGetRestore 别名具有重载,可让您指定NuGetRestoreSettings具有Source属性,您可以使用该属性覆盖使用的提要,例如:

var solutions = GetFiles("./**/*.sln");
// Restore all NuGet packages.
foreach(var solution in solutions)
{
    Information("Restoring {0}", solution);
    NuGetRestore(
        solution,
        new NuGetRestoreSettings {
            Source = new []{ "https://api.nuget.org/v3/index.json" }
        }
    );
}

结论

有几种方法可以解决您的问题。

此外,当您在计算机上配置了多个源时,您还可以通过指定一个源来提高 NuGet 恢复/安装性能,但当前项目仅使用官方源,因为它会跳过所有已配置的提要并直接查找

但是,如果您的提要具有身份验证,那么您将需要为使用nuget.exeNuGetAddSource别名的用户添加凭据。

对于那些使用MyGet的人的提示,它具有预先验证的 url:s 您可以在不添加源的情况下使用,但只需指定 Source 属性以进行还原/安装,这是敏感信息,因此不要将它们存储在构建脚本中,而是作为即环境变量

于 2016-08-07T21:57:11.457 回答