知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦。(毕竟 nuspec 文件没有 .csproj 和 .targets 文件强大而又有扩展性。)


“项目文件中的已知属性系列”分为两个部分:

  • 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅
  • 本文:项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦) - 吕毅

NuGet 相关的属性也分为全局属性和项属性两类。不过,我更愿意分成三类来说明:

nuspec 属性

当然,这部分的属性也是在 csproj 中使用的,是为了生成 nuspec 文件。

使用方法像这样:

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><PackageId>Walterlv.Demo</PackageId><PackageVersion>3.2.0-beta</PackageVersion><TargetFramework>net46</TargetFramework></PropertyGroup>
</Project>

不过我们通常没有这么直接去设置,因为大多数属性都是有默认值的,如果不设置,将自动使用默认值。甚至什么都不写也能生成正确的 nuspec 文件。

  • $(PackageId): NuGet 包的唯一 Id,对应 NuGet 的 Id 属性。这个 Id 需要在整个服务器(例如 nuget.org)上唯一,如果没设置,则使用 $(AssemblyName);例如 Newtonsoft.Json
  • $(PackageVersion): NuGet 包的包版本,可以使用语义版本号(参见语义版本号(Semantic Versioning) - 吕毅),如果没设置,则使用 $(Version);例如 3.2.0-beta
  • $(PackageVersionPrefix): 包版本前缀,默认为空。
  • $(PackageVersionSuffix): 包版本后缀,默认为空。
  • $(Authors): 包的作者;建议指定成在 nuget.org 上的用户名,这样访客可以点击包作者查看到包作者的信息;多个名字用分号分隔。
  • $(Title): 包的显示名称,如果没设置,则使用 $(PackageId)
  • $(PackageDescription): 包的描述文字,如果填写了,则用户在浏览包的时候可以看到。
  • $(Copyright): 包的版权声明
  • $(PackageRequireLicenseAcceptance): 是个布尔值,如果为 true,则在安装包之前要求同意协议。
  • $(PackageLicenseUrl): 此 NuGet 包协议所在的 url。
  • $(PackageProjectUrl): 此 NuGet 包的项目 url。
  • $(PackageIconUrl): 此 NuGet 包的图标 url,无论是 nuget.org 还是 Visual Studio 都将从这个 url 下载包的图标。
  • $(PackageTags): 标签,用分号分隔;指定多个标签有助于用户在 nuget.org 上搜索到你的 NuGet 包。
  • $(PackageReleaseNotes): 这个版本的 Release 记录。
  • $(RepositoryUrl): 仓库 url,例如 https://github.com/dotnet-campus/MSTestEnhancer.git
  • $(RepositoryType): 仓库类型,例如 git、tfs。
  • $(RepositoryBranch): NuGet 4.7 才开始的新属性!此包对应的仓库分支,例如 master
  • $(RepositoryCommit): NuGet 4.7 才开始的新属性!此包对应的提交号,例如 2d3ef96ee704d7896eeb2d88fbc987b2004ff786
  • $(PackageType): 我还没有理解到此属性的作用。

以上有些信息在每次 NuGet 发布之前都是要改的,例如:$(PackageVersion)$(PackageReleaseNotes)$(RepositoryCommit)。所以很明显——这不是用来给开发者设置的属性,是用于辅助我们生成打包工具的。

配置属性

这些属性会影响生成 NuGet 包的过程。

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><!-- 此程序集不可打包,通常在单元测试项目中设置此属性。 --><IsPackable>false<IsPackable><Description><Description><DevelopmentDependency><DevelopmentDependency><PackageOutputPath><PackageOutputPath><!-- 如果指定为 true,那么还会额外生成 PackageId.symbols.nupkg 包,除了原有包的内容外,还额外包含全部的输出文件,以及源码和项目文件,用于调试。 --><IncludeSymbols>true<IncludeSymbols><!-- 大致与 IncludeSymbols 相同,不过只会额外把 pdb 和 Compile 类型的文件打包到 NuGet 包中。如果使用 ProjectReference 引用的项目没有指定 TreatAsPackageReference=false,也会一起被打包。 --><IncludeSource>true<IncludeSource><PackageTypes><PackageTypes><!-- 如果指定为 true,那么生成的 dll 将拷贝到 NuGet 包的 tools 目录下。 --><IsTool>true<IsTool><!-- 如果 lib/**/*dll 中没有发现 dll,NuGet 打包过程中会有警告;将这个属性设为 true 可以禁用警告;这在制作纯工具型 NuGet 包是非常有用。 --><NoPackageAnalysis>true<NoPackageAnalysis><MinClientVersion><MinClientVersion><IncludeContentInPack><IncludeContentInPack><!-- 默认情况下,项目输出的 dll 会被打包到 lib 目录下;设置了此属性后,就可以打包到其他目录下了。此例打包到 task 目录下 --><BuildOutputTargetFolder>tasks<BuildOutputTargetFolder><ContentTargetFolders><ContentTargetFolders><!-- 以下属性都是为了使用单独的 nuspec 文件而准备的;如果不使用 nuspec 文件,通常无需设置这些属性。 --><!-- 默认情况下,使用 dotnet pack 打 NuGet 包时,也会顺便编译;但设置此值为 true 后,就会像 nuget.exe 那样不进行编译了。 --><NoBuild>true</NoBuild><!-- 默认是 true,如果指定为 false,那么项目编译输出的 dll 文件将不会被打包到 NuGet 包中。 --><IncludeBuildOutput>false<IncludeBuildOutput><!-- 如果需要额外手工编写 nuspec 文件,那么使用此属性指定绝对或相对路径。 --><NuspecFile>Walterlv.Demo.nuspec<NuspecFile><!-- 生成的属性可以时 nuspec 文件中的占位符生效,例如 <file src="$SampleProperty$" target="src/" />  --><NuspecProperties>SampleProperty=Program.cs<NuspecProperties><!-- 如果 NuspecFile 使用相对路径,那么就会相对于此路径;通常不需要指定。 --><NuspecBasePath><NuspecBasePath></PropertyGroup>
</Project>

以上没有设置值和注释的属性,我正在查阅资料。

项属性

文件

为了脱离 nuspec 文件来打包,csproj 中需要对特殊用途的文件设置特别的 NuGet 属性。

例如 Pack 属性可以额外指定一或一组通配符文件需要被打包到 NuGet 包中;PackagePath 则指定了打包到 NuGet 包的路径(NuGet 会通过扩展名来自动识别这是文件夹还是文件,所以可以通过这个属性来重新指定名称,但无法重新指定扩展名)。

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><Content Include="readme.txt"><Pack>true</Pack><PackagePath>\</PackagePath></Content><Content Include="PackageId.targets"><Pack>true</Pack><PackagePath>buildMultiTargeting\</PackagePath></Content></PropertyGroup>
</Project>

引用

引用中也可以加入一些 NuGet 包的生成属性。

无论是 <ProjectReference /> 还是 <PackageReference />,都可以额外加上 <IncludeAssets> <ExcludeAssets> <PrivateAssets> 属性。

使用方法类似这样:

<PackageReference Include="Walterlv.Demo" Version="3.0.0-beta"><IncludeAssets>all</IncludeAssets><ExcludeAssets>contentFiles</ExcludeAssets><PrivateAssets>contentFiles;analyzers</PrivateAssets>
</PackageReference>

或者这样:

<PackageReference Include="Walterlv.Demo" Version="3.0.0-beta" PrivateAssets="all" />

不区分大小写。

  • <IncludeAssets> 引用的项目或包中的指定部分是本项目的依赖项。默认为 all
  • <ExcludeAssets> 引用的项目或包中的指定部分不是本项目的依赖项,应该排除。默认为 none
  • <PrivateAssets> 引用的项目或包中的指定部分依然是本项目的依赖项,但是在打 NuGet 包时不作为依赖项(不会传递到下一个项目)。默认为 contentfiles;analyzers;build

如果你正试图用 NuGet 编写一个编译时工具,那么,你可能需要在所有引用的最后加上如下行,将所有的包引用都设为 PrivateAssets

<PackageReference Update="@(PackageReference)" PrivateAssets="All" />

如果你希望了解 Reference PackageReference 以及上面 @ 的含义,可以阅读我的另一篇文章:理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv。


参考资料

  • NuGet pack and restore as MSBuild targets - Microsoft Docs
  • NuGet PackageReference format (package references in project files) - Microsoft Docs

转载于:https://www.cnblogs.com/walterlv/p/10236460.html

项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)...相关推荐

  1. java 像素矩阵_JAVA eclipse 中,已知灰度图像的像素矩阵怎么输出这个图像

    JAVA eclipse 中,已知灰度图像的像素矩阵如何输出这个图像? JAVA eclipse 中,已知灰度图像的像素矩阵如何输出这个图像?求指教. ------最佳解决方案------------ ...

  2. 如何快速的向数据库中插入已知的1000万条数据

    MySQL 如何快速的向数据库中插入已知的1000万条数据 假设这1000W条数据在同一个集合里,那么将这个集合进行遍历,循环1000W次,结合数据库编程技术,如JDBC,就可以插入数据库,这么简单的 ...

  3. js 对象数组中的已知对象的属性得到对象下标

    arr 对象数组, wyw已知属性 多用于接口返回数据后根据已知属性查其他属性 var arr = new Array({"name": "wxx", &quo ...

  4. 查询屏幕中一个已知颜色的值

    1.登录微信网页版,快捷键打开微信截图(ctrl+A),对颜色所在的区域进行截图,将鼠标停放在颜色上面,就会有颜色值,如图: 2.可以知道所选中的颜色值为RGB:(199.21.133),这是一个十进 ...

  5. 潮流计算中,已知末端功率和首端电压,手算方法

    首先,这种情况的潮流是要迭代求解的,但是由于P和U显然不是一个节点,所以我们假设所有节点的电压为. 注意:是把所有节点的电压都看作额定电压,而不是说,最末端的电压看作额定电压,其他节点的电压通过最后的 ...

  6. 在pycharm中使用conda虚拟环境(conda虚拟环境是已经创建好的),解决python安装包文件很费劲的问题

    查看conda的虚拟环境 使用PyCharm连接conda创建的虚拟环境,需要一个前提就是虚拟环境必须存在,使用conda env list命令查看虚拟环境列表 打开PyCharm软件 打开pycha ...

  7. 已知矩阵 matlab,在MATLAB中,已知矩阵A,那么A(:,2:end)表示

    摘要: 已知供输工方.表示添资料准加剂.加及标应提原料有关的()的出国法等使用,品""进办理报检时口食.已知信息系统模型不包逻辑括(.... 已知 信息系统构化中的结方法设计,矩阵 ...

  8. CAD手机看图软件中如何根据已知坐标点绘制线段?

    在使用CAD手机看图软件查看CAD图纸的过程中,需要绘制直线或者多线段的时候,一般情况下是选择已有图形夹点进行绘制,但如果已知具体的每个坐标点,那么该如何通过坐标点连接起对应的线段?接下来给大家简单介 ...

  9. Altium designer 中已知一个网络标号( Net Label),快速查找另一个( Net Label)方法

    在Altium designer 的原理图 中,已知一个网络标号( Net Label),快速查找另一个( Net Label)方法: 比如定位原理图的 YWMS1 网络标号(net label), ...

最新文章

  1. uva 10491 Cows and Cars
  2. 为什么mysql打开闪屏_mysql登录闪屏问题解决办法
  3. 微盟“删库”程序员被判6年,供述无力偿还网贷,酒后感觉生活不如意
  4. EMOS SPF开启收不到信 及WEB收件箱不显示邮件列表等问题解决处理记录
  5. r语言和metawin_Windows下使用Rtools编译R语言包
  6. 构建高并发高可用安全的IT系统-高并发部分
  7. u-boot 源码分析讲解
  8. SDNU 1423.入学考试(01背包)
  9. Layout自动布局(2)-手写代码
  10. 解决Office2007安装时出现错误1706的方法
  11. 万能科学计算机app,万能科学计算器
  12. ELK入门(Elastic Stack)
  13. Smartbi电子表格版功能概览
  14. R-可视化(五):饼图/圆环图
  15. html+css制作盾牌飞入效果
  16. 青楼残梦-第一次被投诉后感
  17. pr cc版拖动时间线时音频轨道发出声音的解决方法
  18. 程序员每天加班到晚上12点,早上迟到几分钟被领导批:价值观不符
  19. 3G上网卡在Liunx系统上实现上网的过程
  20. vue基本事件domo

热门文章

  1. MySql优化的方法
  2. string find简析
  3. 3.放弃CHAR吧,在铸成大错之前!
  4. .net 显示时间为YYYY-MM-DD格式
  5. 一个项目涉及到的50个Sql语句(整理版)
  6. 一些数据库优化经验资料整理
  7. 01 Python基础学习
  8. linux下独立core2.1部署发布过程
  9. Python 之路 Day5 - 常用模块学习
  10. bat 批量提取指定目录下的文件