最近,我开始从我的几个项目中收集nuget包。首先,我开始使用Package Explorer应用程序。这是一个很好的工具,但如果你进行持续集成,它就不那么有用了。然后我研究了指定 nuspec 模板文件,并传递更改数据,例如版本号,作为命令行参数。后来,我想知道如何定义nuget包依赖项。事实证明,如果指定 csproj ,nuget.exe已经基于 package.config 执行此操作。此外,它还从汇编信息中提取相关数据,如作者,版本,版权。我现在缺少的是能够在命令行中指定licenseUrl。但我希望这个问题更加通用。所以我问:
打包nuget包的首选方法是什么?
答案 0 :(得分:72)
这是一个鲜为人知的事实:你可以将两者结合起来! 定位csproj文件,并确保在同一目录中有一个与csproj文件同名的nuspec文件。 NuGet将在包创建过程中合并两者。
简而言之:目标<ProjectName>.csproj
,可选择添加相应的 tokenized <ProjectName>.nuspec
文件,以供NuGet.exe用作元数据。
它使您免于管理输出位置,依赖项,版本以及可从项目中派生的其他内容。
答案 1 :(得分:17)
对于简单包,您可以直接从.csproj
或.vbproj
创建包。但是对于更高级的包,尤其是当您需要将自定义文件提取到包中时,需要使用.nuspec
。我通常从csproj开始,根据需要移动到nuspec。您始终可以使用csproj上的nuget spec
命令获取nuspec。
https://docs.nuget.org/create/creating-and-publishing-a-package
您可以使用licenseUrl
参数Properties
nuget pack
在内的任何属性
nuget pack -properties licenseUrl=http://blah
答案 2 :(得分:13)
使用Visual Studio 2017的.csproj,您不需要.nuspec文件。实际上,您可以将这些值直接添加到csproj中,它会将它们拾取起来。
右键单击Visual Studio中的项目,编辑xxxxx.csproj。记事本也可以正常工作。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>1.0.1</Version>
<authors>Subtracts</authors>
<TargetFrameworks>netstandard1.6;net452</TargetFrameworks>
<AssemblyName>Checkout.net</AssemblyName>
<PackageId>Checkout.net</PackageId>
...
</Project>
P.S。由于我没有足够的声誉来发表评论,我将留下答案,而不是评论Xavier的答案。 :)
答案 3 :(得分:3)
自2018年2月起,使用.NET Core,您需要为基本规范文件属性提供.nuspec
文件。
但dotnet pack
命令不会使用.nuspec
文件,除非您将<NuspecFile>relative path to nuspec</NuspecFile>
添加到.csproj
文件中。
请参阅https://github.com/dotnet/cli/issues/2170
现在大多数软件包都可以在没有.nuspec
文件的情况下生成。需要注意的是依赖关系。您可能需要向某些工具添加PrivateAssets
元素,例如msbump
和嗯,SpecFlow可能。
<PackageReference Include="msbump" Version="2.3.2">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
这会阻止此程序包依赖项“流向”程序包的依赖项。
还值得一提的是,以最灵活的方式指定版本。
https://docs.microsoft.com/en-us/nuget/consume-packages/dependency-resolution#floating-versions
范围语法。