问题描述
<?xml version="1.0" encoding="utf-8"?>
<package>
<Metadata>
<id>example</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<copyright>$copyright$</copyright>
</Metadata>
<files>
<file src="example.targets" target="build" />
<file src="example.props" target="build" />
</files>
</package>
example.targets和example.props何时消耗?
最初,我认为只是在项目的构建过程中才使用Nuget软件包。
但是似乎在安装时使用了道具文件?
我在消耗项目中使用的是老式的packages.config。
任何人都可以向我指出相关细节或提出建议。谢谢。
解决方法
就像this document所说的那样,
将nuget软件包安装到项目中时,将首先阅读.props添加在项目文件的顶部; .targets添加在 底部。
example.props
。
因此,属性将在构建过程开始时可用。
通常用于定义新的全局属性或几个新项目 可以将一些文件包含到您的项目中。 属性和项目将在此时执行。
使用已安装的nuget软件包构建项目时,将读取 example.targets
。
Nuget 将在.props
的早期导入Microsoft.Common.props
文件。
而且该原理实际上与this document中所述的原理相同。
更多信息,当您在项目中安装nuget软件包时, nuget 将读取csproj
文件(将参考节点添加到{{1 }}文件。
因为,安装了nuget时,它将读取csproj
文件的一部分,并且仅会读取标题部分的内容,例如csproj
文件,并且Microsoft.Common.props
文件是在其之前导入的。因此,当您安装nuget软件包时,将完全读取.props
文件,因此将首先读取并执行其内容的所有xml节点。
因此,它将在您安装nuget软件包时起作用。
但是,.props
将被导入到.targets
文件的底部。因此,当安装nuget软件包时,它无法到达那里,并且根本无法读取文件,因此仅在构建项目时才能读取文件。
事实上,csproj
文件被读取了两次。一次是安装nuget的时间,另一次是构建项目的时间,但是.props
仅在构建项目时才能读取。
更新1
注意:
对于MSBuild的目标,这很特殊。诸如copy task之类的某些任务是在 target 下编写的。但是,如果使用.props或.targets执行目标,则应执行构建过程。因此,如果要在nuget软件包的安装过程中执行目标,则显然不起作用。并且您应该执行构建过程来执行它。而且,当您安装nuget软件包时,它将不会执行构建过程。
正如我之前所说,使用目标时.targets
和.props
是相同的。当 MSBuild 读取.targets
或.props
并输入目标时,由于条件类似于.targets
,但是,它处于到目前为止,安装过程而不是构建过程。并且BeforeTargets="Build"
需要构建过程。因此它将跳过它。
BeforeTargets="Build"
表示msbuild在nuget安装过程中首先读取文件。它将获得可以在主项目中包含一些文件的属性或项目。 但是目标取决于构建过程,因此 MSBuild 将在nuget安装过程(尚未执行构建)下跳过该目标。