Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# nuget包装csproj与nuspec之间的差异_C#_.net_Nuget - Fatal编程技术网

C# nuget包装csproj与nuspec之间的差异

C# nuget包装csproj与nuspec之间的差异,c#,.net,nuget,C#,.net,Nuget,最近,我开始从我的几个项目中打包nuget包。首先,我从PackageExplorer应用程序开始。这是一个很好的工具,但是如果您进行持续集成,它就没有那么有用了。然后,我研究了如何指定nuspec模板文件,并将不断变化的数据(如版本号)作为命令行参数传递。后来,我想知道如何定义nuget包依赖项。事实证明,如果您指定了csproj,那么nuget.exe已经基于package.config执行此操作。此外,它还从汇编信息中提取作者、版本、版权等相关数据。我现在缺少的是在命令行中指定licens

最近,我开始从我的几个项目中打包nuget包。首先,我从PackageExplorer应用程序开始。这是一个很好的工具,但是如果您进行持续集成,它就没有那么有用了。然后,我研究了如何指定nuspec模板文件,并将不断变化的数据(如版本号)作为命令行参数传递。后来,我想知道如何定义nuget包依赖项。事实证明,如果您指定了csproj,那么nuget.exe已经基于package.config执行此操作。此外,它还从汇编信息中提取作者、版本、版权等相关数据。我现在缺少的是在命令行中指定licenseUrl的功能。但我希望这个问题更一般。所以我想问:


打包nuget软件包的首选方式是什么?

对于简单的软件包,您可以通过
.csproj
.vbproj
直接创建软件包。但对于更高级的软件包,尤其是当您需要将自定义文件拉入软件包时,您需要使用
.nuspec
。我通常从csproj开始,根据需要搬到nuspec。您始终可以使用csproj上的命令
nuget spec
获取nuspec

您可以使用
properties
参数指定任何属性,包括
licenseUrl
,以
nuget-pack

nuget pack -properties licenseUrl=http://blah

这里有一个鲜为人知的事实:您可以将两者结合起来! 以csproj文件为目标,确保同一目录中有一个与csproj文件同名的nuspec文件。NuGet将在包创建过程中合并这两者

简而言之:target
.csproj
,可以选择添加一个相应的
.nuspec
文件,作为NuGet.exe使用的元数据


它使您不必管理输出位置、依赖项、版本和其他可以从项目中派生的内容。

对于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>

1.0.1
减去
netstandard1.6;net452
Checkout.net
Checkout.net
...

p、 由于我没有足够的声誉发表评论,我将留下一个答案,而不是对Xavier的答案发表评论。:)

对于.NET Core,从2018年2月起,您将需要提供一个
.nuspec
文件,用于任何超过基本规范文件属性的文件

但是,
dotnet pack
命令不会使用
.nuspec
文件,除非您将
到nuspec
的相对路径添加到
.csproj
文件中

大多数软件包现在不需要
.nuspec
文件即可制作。要注意的是依赖关系。您可能需要将
PrivateAssets
元素添加到一些工具中,例如
msbump
和um,SpecFlow

<PackageReference Include="msbump" Version="2.3.2">
  <PrivateAssets>all</PrivateAssets>
</PackageReference>

全部的
这将阻止此包依赖项“流动”到包的依赖项

关于以最灵活的方式指定版本,也值得一读

和范围语法


嗨,泽维尔,谢谢你指出这一点:)我已经找到了这一点,这也表明了这种方法。我从你那里得到的关于WarmCrocConf的书中也描述了这一点吗?;)很棒的演示文稿(顺便说一句!)嗨,马提亚,谢谢你!如果我没有弄错的话,第71页提到了:)有可能从assemblyinfo获得版本并拥有nuspec吗?我确实需要nuspec作者和releasenotes位,但似乎我必须处理nuspec中的版本标记以及assemblyinfo@JohnKorsnes您尝试使用nuspec为author和releasenotes等预填充值,同时保留版本标记标记?($version$)我相信我只是试图省略它,但这没有帮助(因为包失败了)。将查看是否将其保留为标记化帮助当您要从Visual Studio编辑
.csproj
文件时,您需要在“编辑csproj”选项可用之前选择“卸载项目”。@Chrono这取决于项目类型,对于.NET Core和.NET标准项目,它不是必需的。@Chrono@Stijn当您使用新的csproj格式(即以
开头)时,它不是必需的。您可以将新的csproj格式用于.net framework项目,包括WPF和WinForms项目。