从文件共享迁移包

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

Azure Artifacts 将托管的 NuGet 源作为服务提供。 如果将 NuGet 包用作持续交付工作流的一部分,Azure Artifacts 可帮助通过公共和专用源管理依赖项。 Azure Artifacts 适用于支持经过身份验证的 NuGet 源的任何持续集成系统。

关键概念

与文件共享相比,Azure Artifacts 提供了许多优势:

  • 索引: Azure Artifacts 维护每个源中所有包的索引,这可实现快速 nuget list 操作。 文件共享上的列表操作要求客户端打开每一个 nupkg 并检查元数据, nuspec 除非你的文件共享已配置为提供 NuGet 客户端理解的索引。

  • 不可变性: 例如,包版本 (, MyPackage.1.0.0.0.nupkg) 只能推送到源一次。 这可确保该版本的任何依赖项都保证保持有效。 但是,如果工作流使用较新的二进制文件发布包而不更改版本号,则这些工作流在移动到 Azure Artifacts 源时会中断。 详细了解 Azure Artifacts 中的 不可变性

  • 格式良好: Azure Artifacts 会验证所有推送的包,以确保它们格式良好。 这可以防止无效的包进入开发和生成环境。 但是,在迁移到 Azure Artifacts 源时,发布格式不正确的包的任何工作流都会中断。

注意

建议使用 NuGet 版本 4.8.2 或更高版本。 还支持旧版 NuGet 版本 2.x。

身份验证和授权

如果使用 Active Directory 支持的文件共享,则你和本地生成代理可能会使用 Windows NTLM 自动进行身份验证。 将包移动到 Azure Artifacts 需要进行一些更改:

  • 认证: 需要提供对 NuGet 客户端的访问权限才能推送和还原包。

    • Visual Studio:凭据获取自动发生。
    • nuget.exe:安装 凭据提供程序后,凭据获取会自动发生。
  • 授权: 确保需要访问包的任何主体 (用户、服务组织、组等) 具有适当的权限。 有关详细信息,请参阅 权限 部分。

迁移包

迁移包是一个 4 步过程:

  1. 清点现有包源
  2. 制定权限计划
  3. 设置源
  4. 使用源

清点现有包源

在进行任何配置更改之前,请检查现有 NuGet 文件共享:

  • 代码库中的任何nuget.config文件(可能与解决方案 (.sln) 文件位于同一文件夹中)

  • 全局nuget.config文件:

    • 命令提示:%APPDATA%\NuGet\NuGet.Config
    • PowerShell:$env:APPDATA\NuGet\NuGet.Config

查找服务器路径 (示例 <add key="SMBNuGetServer" value="\\server\share\NuGet" />) 并复制它。 你将使用以下部分的路径列表。

制定权限计划

设置新源时,可以:

  • 设置源权限以匹配现有的文件共享权限。
  • 将源权限与现有的 Azure DevOps 团队和组保持一致。

如果要匹配现有文件共享权限,请注意包含包的每个共享的权限。 具体而言,请记下主体:

  • 完全控制
  • 修改写入
  • 读取 & 执行列出文件夹内容读取

设置源

现在,你已清点了现有包源,现在可以设置源了。 在本演练中,我们将假定源到 SMB 共享的 1:1 映射。

创建源

对于每个 SMB 共享,请按照说明 创建源

  • 使用 SMB 共享文件夹的名称作为 源名称
  • 选择源 可见性上游源范围

对于已创建的每个源,设置源权限时应考虑一组 源权限

如果选择设置新的源权限以匹配现有文件共享权限,请使用下表为主体授予适当的权限:

文件共享权限 源权限
完全控制 所有者
修改、写入 作者
读取 & 执行、列出文件夹内容、读取 读取者

使用源

对于每个源,请选择“连接到源>”NuGet.exe并从“项目设置”部分复制源 URL。 需要源 URL 才能迁移包并更新 NuGet 配置。

迁移 NuGet 包

设置源后,可以从每个文件共享批量推送到相应的源。 为此,请执行以下操作:

  1. 在提升的 PowerShell 提示窗口中运行以下命令。 这会设置环境,使你能够使用 nuget.exe 和 Azure Artifacts 源。

    init.ps1
    
  2. 对于每个共享,请使用以下命令将共享中的所有包推送到新源:

    nuget push <YOUR_PACKAGE_PATH>\*.nupkg -Source <YOUR_SOURCE_URL> -ApiKey Azure DevOps Services
    

提示

对于较大的团队,在执行 nuget push 操作之前,应考虑将每个共享标记为只读,以确保在迁移期间没有人添加或更新包。

更新 NuGet 配置

现在,返回到在“库存现有包源”部分中找到的每个nuget.config文件。 对于每个共享, (示例 <add key="SMBNuGetServer" value="\\server\share\NuGet" />) 找到文件共享路径,并将其 value 替换为新源的源 URL。

与生成集成

更新内部版本,确保它们具有适当的凭据,用于使用和发布源中的包。 有关如何 在 Azure Pipelines 中还原 NuGet 包 以及如何 使用 Azure Pipelines 发布 NuGet 包 的详细信息。