如何在MSBuild恢复目标中包含预发布软件包

9
此问题仅适用于MSBuild 15.1+(Visual Studio 2017)PackageReference,这是NugetMSBuild中完全集成的新方式。
在我的持续集成脚本中,我有类似以下内容:
MSBuild.exe /t:Restore MySolution.sln /p:RestoreConfigFile=NuGet.config

其中一个csproj文件包含:

<PackageReference Include="MyPackageA">
    <Version>1.2.*</Version>
</PackageReference>

MyPackageA 是一个内部包,我希望 NuGet 能够解决引用的最新版本,包括预发布版本。

我们来看两个例子:

例子 #1

可用的包有:

  • MyPackageA 版本 1.2.7-dev1
  • MyPackageA 版本 1.2.7-dev2
  • MyPackageA 版本 1.2.7-dev3
  • MyPackageA 版本 1.2.8

我希望 NuGet 解决依赖关系并选择 MyPackageA 版本 1.2.8。

例子 #2

可用的包有:

  • MyPackageA 版本 1.2.7-dev1
  • MyPackageA 版本 1.2.7-dev2
  • MyPackageA 版本 1.2.7-dev3
  • MyPackageA 版本 1.2.8
  • MyPackageA 版本 1.2.9-dev1
  • MyPackageA 版本 1.2.9-dev2

我希望 NuGet 解决依赖关系并选择 MyPackageA 版本 1.2.9-dev2。

然而,在这两个例子中,它只会解决到版本 1.2.8(稳定版)。

有没有办法告诉 MSBuild 或者 NuGet 包括预发布的包?


请提供更具体的描述,说明您试图完成的内容,并提供一个项目文件的示例,以便我们了解其行为不符合预期的情况。 - Martin Ullrich
@MartinUllrich,有时间请再看一下,我已经添加了两个例子来更清晰地说明问题。谢谢。 - Alex Sanséau
3个回答

9

目前,预发布版本不能与浮动版本一起使用。

您可以使用

<PackageReference Include="mypk" Version="1.0.*" />

或者

<PackageReference Include="mypk" Version="1.0.1-*" />

但不包括1.0.*-*

请参见此 GitHub 问题,其中跟踪此功能请求。


感谢提供问题链接。我会非常关注它。 - Alex Sanséau
谢谢,但它对于 dotnet build 和 dotnet test 无效,它们仍然尝试恢复软件包而不是浮动的,这有一个解决方法可以使用 --no-restore 参数,但我认为它也应该在没有该参数的情况下工作。 - rfcdejong

2

NuGet版本>5.6的浮动版本语法允许一些非常强大的版本范围,但是以下3个浮动版本可能更适合您的情况:

<!-- Float everything! Latest version available including prerelease-->
<PackageReference Include="mypk" Version="*-*" />

<!-- Prefer latest 1.X version, include prerelease and stable -->
<PackageReference Include="mypk" Version="1.*-*" />

<!-- Prefer latest 1.0.X version, include prerelease and stable -->
<PackageReference Include="mypk" Version="1.0.*-*" />

Ref


1
如何在MSBuild恢复目标中包含预发布包
据我所知,nuget restore没有-IncludePrerelease选项,您可以查看还原命令的选项。而且MSBuild恢复也没有此选项,MSBuild恢复目标
此选项用于nuget 安装, 更新
作为测试,我将选项-IncludePrereleasePreRelease添加到命令行nuget restore中,然后我收到错误消息:

未知选项:'-IncludePrerelease'

enter image description here

此外,当我们使用nuget.exe restoreMSBuild.exe /t:Restore恢复NuGet包时,NuGet将根据packages.configPackageReference中的包列表下载并安装任何缺失的包到packages文件夹中,这些文件中指定了版本信息,例如:
<package id="ExamplePackage" version="6.1.0" targetFramework="net45"/>

并且

<PackageReference Include="ExamplePackage" Version="6.1" />

NuGet会下载相应版本的软件包,因此我们不需要使用选项-IncludePrerelease

更新:

我应该提到我的引用包含通配符,我希望通配符解析为最新版本,包括预发布版本(如果它是最新的)。

实际上,这是关于还原PackageReference的预发布软件包的问题:

https://github.com/NuGet/Home/issues/912

你可以追踪此线程以获取有关此问题的最新状态,NuGet团队已将此问题设置为pri 0,并尝试尽快解决此问题。
希望这可以帮到你。

@LeoLiuMSFT,谢谢您的回复。我应该提到我的引用包含通配符,并且我希望这个通配符能够解析到最新版本,包括预发布版本(如果是最新版本)。请在您有空的时候重新查看一下,我已经添加了两个示例来说明问题。 - Alex Sanséau
@AlexSanséau,好的,我稍后会检查一下,并尝试提供更新。 :) - Leo Liu
@AlexSanséau,我已经使用样例进行了测试,得到了与您相同的结果。然后我发现这是关于NuGet的一个公开问题,https://github.com/NuGet/Home/issues/912。您可以查看我的更新答案以获取详细信息。 - Leo Liu
@LeoLiuMSFT,感谢您在GitHub上找到了这个问题的参考。我一定会跟踪它,希望这个问题能够尽快得到解决。 - Alex Sanséau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接