在许多项目/解决方案中保持Nuget软件包的更新

时间:2019-06-20 16:09:48

标签: nuget nuget-server

如果在多个解决方案上使用相同的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,这与我的情况不同。我希望在多个解决方案中更新软件包,而不是在一个解决方案中更新多个项目。

1 个答案:

答案 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中。