Visual studio 从VisualStudio构建NuGet包
我正试图通过NuGet软件包和私有源共享一个公司内部程序集。此程序集以.NET Framework 4.6.1为目标。我希望这些NuGet软件包在发布构建期间从VisualStudio自动打包。我知道我可以将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
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=""nuget" pack "$(ProjectPath)" -OutputDirectory "$(ProjectDir)..\..\packages" -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的原始答案