我已经使用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管道。
答案 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或任何其他任务来更新项目文件中的Reference
,HintPath
信息和packages.config
文件中的软件包版本。
修改文件后,添加另一个命令行任务以将更改提交到存储库:
git commit -m "Update package version"
git push -u origin master
更新:
使用git clone <repo> <directory>
克隆存储库时,通常需要使用PAT在源链接中提供证书:
链接看起来像:
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在管道中编译时,它将获取最新的。当回购协议被删除时,或者第一次时,它将在初始编译以及已发布的任何新版本中获取最新信息。