【问题标题】:Updating NuGet reference in a different repo in Azure DevOps在 Azure DevOps 的不同存储库中更新 NuGet 参考
【发布时间】:2019-09-04 17:10:32
【问题描述】:

我已经使用 Git 在 Azure DevOps 中设置了一个多存储库。为简单起见,假设我有 2 个存储库(存储库 A 和 B)。

Repo A 的结果是一个通用库 DLL。 Repo B 引用 Repo A 生成的 DLL(通过 NuGet 包)。

Repo A 的 CD 管道将 NuGet 包(在 Repo A 的 CI 管道期间打包)推送到我的 Azure Artifacts 源。

有没有办法在 Repo A 的 CD 管道中添加一个任务来自动更改 Repo B 项目中的 NuGet 包引用(到较新版本)?这样,当 Repo B 被拉到本地存储库时,引用将被更新,而不是通过 NuGet 包管理器并在 Visual Studio 中手动更新?

更新:

应用您的建议后,一切正常,除了当我将 RepoB 的更改拉到我的本地 repo 时,Repo A 的新 NuGet 包在 [Repo B] 的包文件夹中不可用,我有从包管理器中手动获取它。

预构建事件在这里有帮助,但我希望 Repo B 在从 Azure Repos 中提取时完全是最新的。

下面是 Repo A 的 CD 流水线。

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    有没有办法在 Repo A 的 CD 管道中添加任务以自动更改 Repo B 项目中的 NuGet 包引用(到较新版本)?

    没有这种开箱即用的方法可以做到这一点。

    简单的方法是:

    使用以下命令行向 Repo B 中的项目添加 Pre-build 事件:

    nuget.exe update $(ProjectDir)packages.config
    

    如果 Repo B 被拉到本地存储库中,当你在 repo B 中构建项目时,引用会被更新。但是这种方式的限制是这种方法只会修改我们的本地文件,不会直接修改repo中的文件。我们仍然需要手动将更改提交到 repo。

    复杂的方式是:

    在 Repo A 的 CD 管道中添加命令行任务,以使用 git 命令行克隆 repo B:

    git config --global user.email "xxx@xyz.com"
    git config --global user.name "Admin"
    
    git clone <repo> <directory>
    

    然后添加powershell或任何其他任务来更新项目文件中的ReferenceHintPath信息和packages.config文件中的包版本。

    修改文件后,添加另一个命令行任务以将更改提交到 repo:

    git commit -m "Update package version"
    
    git push -u origin master
    

    更新:

    当您使用git clone &lt;repo&gt; &lt;directory&gt; 克隆 repo 时,您需要在源链接中提供您的证书,通常使用 PAT:

    链接如下:

    https://<OrganizationName>@dev.azure.com/<OrganizationName>/MyTestProject/_git/TestSample
    

    然后我们需要将第一个OrganizationName替换为PAT。因此,它将是:

    https://<PAT>@dev.azure.com/<OrganizationName>/MyTestProject/_git/TestSample
    

    对于你的情况,应该是:

    https://<PAT>@xxxxx.Visualstudio.com/....
    

    然后我就可以成功克隆了。

    希望这会有所帮助。

    【讨论】:

    • 简单的方法可以无缝运行,谢谢!目前正在尝试复杂的方式,但面临一些问题。克隆时,我应该使用git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)"吗?此外,最好使用 Project References 或 packages.config?
    • @naregkar,如果简单的方法适合你。可以使用这种方式,推荐。复杂的方式需要使用脚本来修改repo中的文件,不推荐也不安全。对于项目引用或packages.config,它取决于您正在使用的项目类型,SDK类型使用Project References,非SDK类型使用packages.config
    • 我曾希望并更喜欢复杂的方式,因为它会自动更新项目引用。我不介意使用脚本。这是要克隆的命令行link,我收到此错误:##[error]Logon failed, use ctrl+c to cancel basic credential prompt。这就是为什么我问我是否应该使用额外标题。谢谢!
    • @naregkar,抱歉稍后回复,我已经更新了我的答案,提供了一些更详细的信息,请检查是否对您有帮助。
    • 所以这意味着这是我们可以达到的最大值,为了使包在本地恢复是必要的,不是吗?
    【解决方案2】:

    这可能与要求的有所不同。

    使用项目引用(较新的项目):

    使用 Version 属性中的通配符 * 更改您的 Repo B 项目的包参考版本以获取最新版本。

    <PackageReference Include="MyPackageName" Version="*" />
    

    使用 packages.config

    packages.config 不支持通配符,需要多走几步。

    您需要将以下内容添加到您的 nuget.config 文件中的 &lt;configuration&gt; 部分:

    <config>
        <add key="dependencyversion" value="Highest" />
    </config>
    

    确保 nuget.config 是 repo 的一部分。

    然后在管道的Nuget restore 任务中Feeds to use 部分下选择Feed in my NuGet.config,然后指定repo 的nuget.config 的路径。

    无论哪种情况,当 Repo B 在管道中编译时,它都会获取最新的。当 repo 被拉下干净或第一次它会在初始编译以及任何已发布的新版本上获取最新的。

    【讨论】:

    • 我试过这个,但是它不会自动下载更新的包。尝试 Leo Liu-MSFT 的建议。谢谢!
    猜你喜欢
    • 2019-12-20
    • 2021-03-05
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2022-11-22
    • 2019-09-14
    相关资源
    最近更新 更多