【问题标题】:Building NuGet packages from Visual Studio从 Visual Studio 构建 NuGet 包
【发布时间】:2019-10-30 17:09:16
【问题描述】:

我正在尝试通过 NuGet 包和私有源共享内部公司程序集。此程序集面向 .NET Framework 4.6.1。我希望这些 NuGet 包在发布构建期间从 Visual Studio 自动打包。我知道我可以将<GeneratePackageOnBuild>true</GeneratePackageOnBuild> 添加到.csproj。我不确定这是否是特定于 .NET Standard 的属性,但它似乎可以部分工作。但是,当我构建时,我得到了

error MSB4044: The "GetPackOutputItemsTask" task was not given a value for the required parameter "PackageOutputPath".

我一直在尝试学习如何从 Visual Studio 中传递此参数,但我没有看到很多关于参数的文档,除非从命令行手动调用它。在 Visual Studio 中是否有一种简单的方法可以做到这一点?我是不是搞错了?

编辑:这是使用 .NET Framework 类库。我可以从命令行运行 pack 命令,并使用/p:PackageOutputPath="path\here" 为其提供所需的参数。这似乎是为 .NET Core 和 Standard 项目设计的,Visual Studio 可能无法处理打包 .NET Framework 项目。

【问题讨论】:

  • @LexLi 即使在 4.5.2 非 SDK 项目上,也可以使用 NuGet.Build.Tasks.Pack 打包构建。您可以使用 msbuild -t:pack 并编辑 csproj。我在下面添加了完整的答案。

标签: visual-studio msbuild nuget-package


【解决方案1】:

要在“非 SDK” 项目中启用构建打包,使用旧的 .NET 框架(例如:4.5.1)和 Visual Studio 2019 没有使用自定义Target。您需要执行以下步骤:

  1. csproj 上添加第一个 PropertyGroup 标记
  2. 添加最少的标签AuthorsPackageOutputPath
  3. 检查相同的PropertyGroupGeneratePackageOnBuild

现在变量将被传递给内部触发的msbuild -t:Pack 命令。

这是一个工作配置示例,请确保这将是 .csproj 的第一个 <PropertyGroup>

  <PropertyGroup>
    <Title>packageid</Title>
    <Description>your description</Description>
    <Version>1.1.1</Version>
    <ReleaseNotes>New package system</ReleaseNotes>
    <Authors>authors</Authors>
    <Owners>owners</Owners>
    <Copyright>your copyrights</Copyright>
    <PackageOutputPath>bin\Package</PackageOutputPath>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

如果您正在寻找参考资料,请点击此处:

【讨论】:

  • 我不知道发生了什么变化,但我已经尝试了您的建议,但它对我不起作用。今天它可以工作,但我注意到它在创建包后重新运行PostBuildEvents,这意味着我需要弄清楚如何在构建 nuget 包之前使这些发生。目前,Lance 的答案对我来说效果最好,但这似乎也是一个可能的解决方案。
  • 这在 2019 年有效,但重要的是属性组是 .csproj 中的 first 属性组
  • 这个解决方案对我有用。 Visual Studio 2019,.net 框架 4.6.1 项目。而且属性组不是我的 .csproj 文件中的第一个属性组。
  • 这是2021年的正确解决方案。不支持使用带有PackageReferences的nuget pack。
【解决方案2】:

我是不是搞错了?

GeneratePackageOnBuild 属性不适用于.net framework 项目。创建一个新的.net Standard.net Core 类库项目,右击项目你会看到一个Pack命令(不适用于.net framework)。

如果我们单击该按钮,VS 会将该程序集打包到一个 nuget 包中。如果有人不想每次都手动单击该按钮,请转到Project=&gt;Properties=&gt;Package,我们可以看到Generate Nuget Packages on build 复选框。启用它,然后每次构建后都会创建 nuget 包。

实际上,在 VS 中启用该复选框会将语句 &lt;GeneratePackageOnBuild&gt;true&lt;/GeneratePackageOnBuild&gt; 添加到 xx.csproj,但 Project=&gt;Properties 中的 Pack 按钮或 Package 选项卡不适用于.net 框架项目。

所以恐怕答案是否定的,您不应该将该属性用于 .net 框架项目。(我在 VS2017 和 VS2019 中测试了该属性,它什么也没做,无法重现提到的部分工作在你的问题中)

在 Visual Studio 中是否有一种简单的方法可以做到这一点?

正如 Lex Li 所说,您需要使用 nuget pack 命令来执行此操作。要在 VS 中自动执行此操作,您可以考虑在 Post-Build-Event 中配置该命令或使用自定义构建后目标来运行该命令。

因为您希望这些 NuGet 包在发布构建期间从 Visual Studio 自动打包。您可以尝试将此脚本添加到您的 xx.csproj 文件中:

  <Target Name="CustomPack" AfterTargets="build" Condition="'$(Configuration)'=='Release'">
    <Message Text="Custom Pack command starts ..." Importance="high"/>
    <Exec Command="nuget pack $(MSBuildProjectFile) -Properties Configuration=Release"/>
  </Target>

要成功运行此脚本,您需要download the nuget.exe 并将其路径添加到环境变量。或使用完整路径,如"C:\SomePath\Nuget.exe" pack ...

如果在发布模式下构建成功,您将在项目文件夹中看到一个xx.nupkg 文件。

另外:

1.关于nuget pack命令的更多详细信息请参见this document

2.并且不要忘记在项目文件夹中创建一个xx.nuspec文件,以避免遇到像NU5115(未指定xxx)这样的警告。类似问题见here

【讨论】:

  • 我设法让msbuild -t:pack 在每次构建时自动工作,而无需使用自定义Target,您能否查看我的答案?
  • 我不记得为什么一个月前这对我不起作用,但我今天尝试了它并且它起作用了。我使用 msbuild 的原始答案不包括我的 .nuspec 文件中的一些内容。谢谢!
【解决方案3】:

我有一个独特的情况,需要为更旧的应用程序注册 Com Interop,但还需要打包以用于我们公司的其他内部应用程序和开发。实际上,我将它用于 Visual Studio 中的 .NET Framework 项目。手动添加 GeneratePackageOnBuild 确实尝试在 VS2017 中为我制作一个包。我还能够添加其他 .NET Core 项目属性,例如 &lt;Authors&gt;&lt;Description&gt; 等。我还没有尝试过 VS2019,所以可能会受到更多限制,但我希望不会。

问题是 VS2017 没有为包目标提供输出参数(在这种类型的项目中)。因此,我尝试在 After Build 事件中调用 pack ,但这会导致递归循环,因为打包也尝试构建(dotnet 和 nuget 似乎都调用了调用构建的 msbuild pack 目标)。然后,我为 msbuild 找到了一个选项 -p:NoBuild=true,它允许我在没有 msbuild 实际构建项目的情况下调用 pack 目标。因此,我将以下命令添加到 &lt;PostBuildEvent&gt; 并且它可以工作。

"$(MSBuildBinPath)\msbuild" -t:Pack "$(ProjectPath)" -p:PackageOutputPath="$(SolutionDir)..\packages" -p:NoBuild=true

编辑:我最终在我的 csproj 中使用了以下内容。直接调用 nuget 效果更好,因为我有一个 nuspec 文件,在直接调用 MSBuild 时没有被合并或完全使用。

<Target Name="CustomPack" AfterTargets="Build" Condition="'$(Configuration)'=='Release'">
  <Message Text="Custom Pack command starts ..." Importance="high" />
  <Exec Command="&quot;nuget&quot; pack &quot;$(ProjectPath)&quot; -OutputDirectory &quot;$(ProjectDir)..\..\packages&quot; -Prop Configuration=Release" />
</Target>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 2020-01-08
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多