【问题标题】:How to include pre-release packages with MSBuild restore target如何在 MSBuild 还原目标中包含预发布包
【发布时间】:2018-04-19 09:37:51
【问题描述】:

此问题特定于 MSBuild 15.1+ (Visual Studio 2017)PackageReference,这是 Nuget 完全集成到 MSBuild 中的新方式。

在我的持续集成脚本中,我有类似的内容:

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(稳定版本)。

有没有办法告诉MSBuildNuget 包含预发布包?

【问题讨论】:

  • 请提供更具体的描述,说明您试图完成的工作,并提供一个项目文件的示例,该文件的行为与预期不符。
  • @MartinUllrich,有空请重新看一下,我添加了 2 个示例以使问题更清晰。谢谢。

标签: msbuild visual-studio-2017 nuget nuget-package-restore


【解决方案1】:

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

你可以使用

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

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

但不是1.0.*-*

请参阅 this GitHub issue 跟踪此功能请求的位置。

【讨论】:

  • 感谢您提供该问题的链接。我会以极大的兴趣关注它。
  • 谢谢,但它不适用于:dotnet build 和 dotnet test,它仍然尝试在不浮动的情况下恢复包,它有一个使用 --no-restore 参数的解决方法,但是它如果没有那个论点,恕我直言也应该可以工作。
【解决方案2】:

如何在 MSBuild 还原目标中包含预发布包

AFAIK,没有这样的选项-IncludePrerelease 用于 nuget 还原,您可以查看Options for restore command。而且MSBuild restore也没有这个选项,MSBuild restore target

此选项用于 nuget InstallUpdate

作为测试,我在命令行nuget restore中添加了选项-IncludePrereleasePreRelease,然后我收到了错误消息:

未知选项:'-IncludePrerelease'

此外,当我们使用nuget.exe restoeMSBuild.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,感谢您的回复。我应该提到我的参考包含一个通配符,我希望该通配符解析为最新版本,包括一个预发布版本(如果它是最新版本)。有空请重新看一下,我添加了2个例子来说明问题。
  • @AlexSanséau,好的,我稍后会检查它,并尝试提供更新。 :)
  • @AlexSanséau,我用样本进行了测试,得到的结果和你一样。然后我发现这是一个关于 nuget 的公开问题,github.com/NuGet/Home/issues/912。您可以查看我更新的答案以了解详细信息。
  • @LeoLiuMSFT,感谢您在 GitHub 上找到此问题的参考。我一定会跟踪它,希望这会很快得到解决。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2018-07-31
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2017-06-01
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多