如果在多个解决方案上使用相同的nuget软件包,我如何保持它们为最新状态,而不必在发布新版本时打开每个解决方案并更新软件包?
文件夹结构通常是这样的,但是在许多其他项目中却是如此。每个项目都有自己的packages.config
,其中包含各种程序包引用。
$tfs/
├── Solution One/
│ ├ Solution 1.sln
│ ├ nuget.config (solution item)
│ ├── Packages/
│ ├ ├── Newtonsoft.JSON.12.0.2/
│ ├ ├── Jquery3.1.4/
│ ├── Project one/
│ ├ ── packages.config
│ ├ ── whatever.cs
│ ├ ── folder /
│ ├ ── another folder /
│ ├── Project Two/
│ ├ ── packages.config
│ ├ ── file.cs
│ ├ ── folder/
│ ├ ── another folder/
├── Solution Two/
│ ├ Solution 2.sln
│ ├ nuget.config
│ ├── Packages/
│ ├ ├── Newtonsoft.JSON.11.1.0/
│ ├ ├── Jquery1.3.4/
│ ├── Project one/
│ ├ ── packages.config
│ ├ ── whatever.cs
│ ├ ── folder /
│ ├ ── another folder /
│ ├── Project two/
│ ├ ── packages.config
│ ├ ── file.cs
│ ├ ── folder/
│ ├ ── another folder/
我尝试在Package Manager控制台中运行此Powershell,但这一次仅适用于一种解决方案:
$packageId = "jquery"
Get-ChildItem *.sln -recurse | %{.\\nuget.exe restore $_.fullname}
Get-ChildItem packages.config -Recurse `
| Where-Object {$_ | Select-String -Pattern $packageId} `
| %{.\\nuget.exe update -Id $packageId $_.FullName}
我是否需要在每个项目的每个解决方案中更新packages.config
并打开它们以获得更新?我本以为会有一个更简单的方法来做到这一点。我正在使用私有的nuget服务器,如果有作用的话。
注意:我已经看过这个问题:Updating nuget packages in all projects in a solution,这与我的情况不同。我希望在多个解决方案中更新软件包,而不是在一个解决方案中更新多个项目。
答案 0 :(得分:1)
正如@imps在评论中说的,跨解决方案的packages.config
项目没有解决方案。在解决方案中,您可以使用NuGet程序包管理器UI的“管理解决方案的程序包”,“合并”选项卡有助于确保所有项目使用相同的版本,但是您需要对所有解决方案重复此操作。
如果您migrate from packages.config
to PackageReference
,则可以利用MSBuild的可扩展性并导入公共props
文件,或者如果使用Visual Studio 2017或更高版本,请在最高公共父级中使用Directory.Build.Props
所有项目的目录。
在props文件中,定义您关心的软件包的版本,如下所示:
<Project>
<PropertyGroup>
<NewtonsoftJsonVersion>12.0.1</NewtonsoftJsonVersion>
</PropertyGroup>
</Project>
,然后在csproj
文件中,使用<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
。这样做的问题是,您不能再使用VS中的Package Manager UI或Package Manager Console进行升级(可以,但是它将在csproj
中而不是在props
文件中进行更改),但您仍然可以使用用户界面来检查更新。如果您将props
文件添加到解决方案中,则只需单击两次并在键盘上轻按几下即可进行更新,因此这实际上没什么大不了的。
在您的示例中,公共父目录将是TFS根目录,因此为$/Directory.Build.props
。这样做的问题是,如果您使用CI并触发了对$/Solution One/*
的更改运行“解决方案一”构建,并且对$/Solution Two/*
的更改运行了解决方案二,那么它们都会错过对$/Directory.Build.props
。也许可以配置TFS构建触发器以包括它,但是我不记得了,因为我没有使用TFVC已经很久了。
但是,更大的问题是,在您的示例中,很明显您正在使用jQuery
软件包。这使用content
,该文件会在安装/升级时将文件复制到您的项目中。 PackageReference
不能这样工作(它列为package compatibility issue),因此,除非您希望采用不同的过程来升级Web项目中的jQuery和任何其他js / css,否则您将无法将ASP.NET项目迁移到PackageReference
。请注意,ASP.NET Core项目是SDK样式,仅支持PackageReference
,不支持packages.config
,通常使用LibMan或npm来获取CSS和JavaScript。
可以迁移到SDK样式项目的客户,他们甚至可以考虑使用this SDK for central package management,这有助于确保您不会意外将版本号保留在csproj
中。