在Azure DevOps中的其他存储库中更新NuGet参考

时间:2019-08-30 14:03:14

标签: azure-devops azure-pipelines

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

回购A的结果是一个公共库DLL。存储库B引用存储库A生成的DLL(通过NuGet程序包)。

回购A的CD管道将NuGet程序包(在回购A的CI管道期间打包)推送到我的Azure Artifacts提要中。

是否可以在Repo A的CD管道中添加任务以自动在Repo B的项目中更改NuGet包引用(至新版本)?这样,当将Repo B拉到本地存储库时,将更新引用,而不是通过NuGet程序包管理器并在Visual Studio中手动更新?

更新

应用您的建议后,一切正常,但是当我将RepoB的更改拉到本地仓库时,[Repo B]的packages文件夹中没有新的Repo A NuGet软件包,从包管理器手动获取它。

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

下面是回购A的CD管道。

enter image description here

2 个答案:

答案 0 :(得分:2)

  

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

没有这种现成的方法可以做到这一点。

简单的方法是:

使用以下命令行在存储库B中向项目添加预构建事件:

nuget.exe update $(ProjectDir)packages.config

以防万一,当将Repo B拉到本地存储库中时,将在您在Repo B中构建项目时更新引用。但是这种方式的局限性在于该方法只会修改我们的本地文件,而不会直接修改仓库中的文件。我们仍然需要手动将更改提交到存储库。

复杂的方法是:

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

git config --global user.email "xxx@xyz.com"
git config --global user.name "Admin"

git clone <repo> <directory>

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

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

git commit -m "Update package version"

git push -u origin master

更新

使用git clone <repo> <directory>克隆存储库时,通常需要使用PAT在源链接中提供证书:

enter image description here

链接看起来像:

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

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

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

对于您的情况,应为:

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

那我可以成功克隆它。

希望这会有所帮助。

答案 1 :(得分:0)

这可以与要求的方式有所不同。

使用项目参考(较新的项目):

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

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

使用packages.config

packages.config不支持通配符,并且需要执行更多步骤。

您将需要在nuget.config部分的<configuration>文件中添加以下内容:

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

确保nuget.config是存储库的一部分。

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

无论哪种情况,当Repo B在管道中编译时,它将获取最新的。当回购协议被删除时,或者第一次时,它将在初始编译以及已发布的任何新版本中获取最新信息。