Visual studio 从VisualStudio构建NuGet包

Visual studio 从VisualStudio构建NuGet包,visual-studio,msbuild,nuget-package,Visual Studio,Msbuild,Nuget Package,我正试图通过NuGet软件包和私有源共享一个公司内部程序集。此程序集以.NET Framework 4.6.1为目标。我希望这些NuGet软件包在发布构建期间从VisualStudio自动打包。我知道我可以将true添加到.csproj。我不确定这是否是一个特定于.NET标准的属性,但它似乎部分起作用。然而,当我构建时,我得到了 error MSB4044: The "GetPackOutputItemsTask" task was not given a value for the requi

我正试图通过NuGet软件包和私有源共享一个公司内部程序集。此程序集以.NET Framework 4.6.1为目标。我希望这些NuGet软件包在发布构建期间从VisualStudio自动打包。我知道我可以将
true
添加到.csproj。我不确定这是否是一个特定于.NET标准的属性,但它似乎部分起作用。然而,当我构建时,我得到了

error MSB4044: The "GetPackOutputItemsTask" task was not given a value for the required parameter "PackageOutputPath".
我一直在尝试学习如何在VisualStudio中传递此参数,但除了从命令行手动调用它外,我没有看到很多关于参数的文档。在VisualStudio中有没有一种简单的方法可以做到这一点?我做错了吗

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

我做错了吗

GeneratePackageOnBuild
属性不适用于
.net framework
项目。创建一个新的
.net标准
.net核心
类库项目,右键单击该项目,您将看到一个打包命令(不适用于.net framework)

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

实际上,在VS中启用该复选框将向xx.csproj添加语句
true
,但是
Project=>Properties
中的Pack按钮或Package选项卡不适用于.net framework项目

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

在VisualStudio中有没有一种简单的方法可以做到这一点

您需要使用
nuget-pack
命令来执行Lex-Li所说的操作。并且在VS中自动执行此操作,您可以考虑在生成目标后使用自定义命令配置该命令来运行该命令。 因为您希望这些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>

要成功运行此脚本,您需要将脚本的路径添加到环境变量中。或者使用完整路径,如
“C:\SomePath\Nuget.exe”pack…

如果内置版本模式成功,您将在项目文件夹中看到一个
xx.nupkg
文件

此外:

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


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

我有一个独特的情况,即需要注册Com Interop for and older应用程序,但也需要打包以用于我们公司的其他内部应用程序和开发。实际上,我是在VisualStudio的一个.NETFramework项目中得到这个的。手动添加
GeneratePackageOnBuild
确实试图在VS2017中为我生成一个包。我还可以添加其他.NET核心项目属性,如
,等等。我还没有尝试VS2019,所以可能这会受到更多限制,但我希望不会

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

"$(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>

使用旧的.NET framework(例如:.4.5.1)和visual studio 2019非SDK项目中启用内置打包,而不使用自定义
目标。您需要执行以下步骤:

  • 在csproj上添加第一个
    PropertyGroup
    标记
  • 添加最少的标记
    作者
    PackageOutputPath
  • 检查相同的
    PropertyGroup
    是否具有
    GeneratePackageOnBuild
  • 现在,变量将传递给内部触发的
    msbuild-t:Pack
    命令

    这里是工作配置示例,请确保这是.csproj的第一个

    
    包装
    你的描述
    1.1.1
    新包装系统
    
    

  • @LexLi使用
    NuGet.build.Tasks.pack
    甚至在4.5.2版的非SDK项目上,也可以在构建时打包。您可以使用
    msbuild-t:pack
    并编辑csproj。我已经在下面添加了完整的答案。我成功地使
    msbuild-t:pack
    在每次生成时都自动工作,而不使用自定义
    Target
    ,您能检查我的答案吗?我不记得一个月前为什么这对我不起作用,但我今天尝试了它,它成功了。我使用msbuild的原始答案