从 Visual Studio 构建 NuGet 包

bzu*_*ith 9 msbuild visual-studio nuget-package

我正在尝试通过 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".
Run Code Online (Sandbox Code Playgroud)

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

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

Giu*_*cin 9

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

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

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

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

  <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>
Run Code Online (Sandbox Code Playgroud)

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


Lan*_*SFT 4

我在这件事上做错了吗?

GeneratePackageOnBuild属性不适合.net framework项目。创建一个新的.net Standard.net Core类库项目,右键单击该项目,您将看到一个Pack命令(不适用于 .net 框架)。

在此输入图像描述

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

实际上,在 VS 中启用该复选框会将语句添加<GeneratePackageOnBuild>true</GeneratePackageOnBuild>到 xx.csproj,但“打包”按钮或“打包”选项卡Project=>Properties对于 .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>
Run Code Online (Sandbox Code Playgroud)

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

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

此外:

1.有关命令的更多详细信息nuget pack请参阅此文档

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