除了更传统的程序集,NuGet 包有时可能会向使用该包的项目添加自定义生成目标或属性。
这可以通过在项目的生成文件夹中添加有效的 MSBuild 文件 <package_id>.targets ( <package_id>.props 如 Contoso.Utility.UsefulStuff.targets)来实现。
生成文件夹
随着 NuGet 的发展,已添加用于生成和其他用途的各种不同的文件夹。
| 文件夹 | NuGet 版本 | Use |
|---|---|---|
| 内部版本 | 2.5+ | 为项目的每个框架生成逻辑。 |
| buildMultiTargeting | 4.0+ | 针对 outer build 面向多个框架的项目构建逻辑。 仅 PackageReference。 |
| buildTransitive | 5.0+ | 为资产生成逻辑,使其可传递到任何消耗项目。 请参阅 功能 页。 仅 PackageReference。 |
框架特定的构建文件夹
所有 3 个生成文件夹都遵循相同的模式,根据项目目标框架决定最合适的文件。
根生成文件夹中的文件, build/<package_id>.targets 并 build/<package_id>.props 被视为适合所有目标框架。
若要提供特定于框架的文件,请首先将它们放在相应的子文件夹中,例如:
\build
\netstandard1.4
\Contoso.Utility.UsefulStuff.props
\Contoso.Utility.UsefulStuff.targets
\net462
\Contoso.Utility.UsefulStuff.props
\Contoso.Utility.UsefulStuff.targets
请尽量使用特定于框架的生成文件夹,以避免包可能不支持的项目中的误报安装。
请注意,如果一个包在 lib 和 ref 文件夹中都没有文件,而只在框架特定的构建文件夹下有文件,则该包将被视为与所有项目兼容。 包工具的最新版本会在创建此类包时引发 NU5127 警告。
使用包含构建文件的包的项目
PackageReference 项目
.props 和 .targets 不会添加到项目文件,而是通过 {projectName}.nuget.g.targets 和 {projectName}.nuget.g.props 来提供。 运行还原时自动生成这些文件。
当项目面向多个框架时,导入这些文件的条件取决于目标框架名称。
可以将多框架目标的 MSBuild .props 和 .targets 文件放在 \buildMultiTargeting 文件夹中。
生成导入时,将设置一个条件,即 MSBuild 属性 $(TargetFramework) 为空。
packages.config 项目
NuGet 安装包含\build文件的包时,它会在项目文件中添加指向.targets和.props文件的MSBuild <Import>元素。 (.props 在项目文件的顶部添加; .targets 在底部添加)。为每个目标框架添加单独的条件 MSBuild <Import> 元素。
使用 MSBuild 属性和目标创建包
可以使用以下任一工具将 MSBuild .props 和 .targets 包包含在包中。
MSBuild 属性和目标的内容指南
NuGet 不会根据包作者和目标项目本身的需求来限制创作.props.targets方式,因为它们会有所不同。
包中的 .props.targets 不能执行某些操作,例如不要指定影响还原的属性和项,因为这些将被自动排除。
不能添加或更新的属性的一些示例:TargetFramework、TargetFrameworkMoniker、TargetPlatformMoniker、AssetTargetFallback 等。
不能添加或更新的项的一些示例:PackageReference、PackageVersion、PackageDownload 等。