Nuget Build,何时消耗 PackageName.Targets 和 PackageName.props?
Nuget Build, when it PackageName.Targets and PackageName.props consumed?
给定一个名为示例的包文件:
<?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包。
但是安装时好像用到了props文件?
我在消费项目中使用旧式 packages.config。
任何人都可以向我指出这方面的详细信息或建议。谢谢。
正如this document所说,
.props is added at the top of the project file; .targets is added at
the bottom.
example.props
将在您将 nuget 包安装到项目中时首先读取。
因此,属性将在构建过程开始时可用。
通常用于定义新的全局属性,或者几个新的item
它可以将一些文件包含到您的项目中。 Properties和items将在此时执行。
example.targets
将在您使用已安装的 nuget 包构建项目时读取。
Nuget 将在 Microsoft.Common.props
中很早就导入 .props
文件。
和原理其实和this document.
中描述的一样
更详细,当你在项目中安装一个nuget包时,nuget会读取csproj
文件(将引用节点添加到 csproj
文件中)。
因为安装nuget的时候,会读取csproj
文件的一部分,只会读取header部分的内容,比如Microsoft.Common.props
文件,.props
文件在它之前导入。因此,当您安装 nuget 包时,.props
文件将被完整读取,因此其内容的任何 xml 节点将首先被读取和执行。
所以,安装nuget包就可以了
但是,.targets
会被导入到csproj
文件的底部。所以在安装nuget包的时候,到不了那里,根本就读不到文件,所以只有在建工程的时候才会读到文件。
实际上,.props
文件被读取了两次。一次是在安装nuget的时候,一次是在构建项目的时候,但是.targets
只能在构建项目的时候读取
更新 1
注:
MSBuild的target比较特殊。 copy task 等一些任务是在 目标 下编写的。但是,如果您使用 .props 或 .targets 执行目标,则应该执行构建过程。所以如果你想让目标在nuget包的安装过程中执行,显然是行不通的。你应该执行构建过程来执行它。并且当你安装nuget包时,它不会执行构建过程。
所以前面说了,.props
和.targets
在使用target的时候是一样的。当MSBuild读取.props
或.targets
并输入目标时,由于条件类似于BeforeTargets="Build"
,however,到目前为止,它处于安装过程中,而不是构建过程中。 BeforeTargets="Build"
需要构建过程。所以它会跳过它。
This happens 'once'
表示msbuild在nuget安装过程下先读取文件。它将获取可以将一些文件包含到您的主项目中的属性或项目。 但是目标取决于构建过程,所以MSBuild会在nuget安装过程中跳过它(还没有执行构建)。
给定一个名为示例的包文件:
<?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包。
但是安装时好像用到了props文件?
我在消费项目中使用旧式 packages.config。
任何人都可以向我指出这方面的详细信息或建议。谢谢。
正如this document所说,
.props is added at the top of the project file; .targets is added at the bottom.
example.props
将在您将 nuget 包安装到项目中时首先读取。
因此,属性将在构建过程开始时可用。
通常用于定义新的全局属性,或者几个新的item 它可以将一些文件包含到您的项目中。 Properties和items将在此时执行。
example.targets
将在您使用已安装的 nuget 包构建项目时读取。
Nuget 将在 Microsoft.Common.props
中很早就导入 .props
文件。
和原理其实和this document.
中描述的一样更详细,当你在项目中安装一个nuget包时,nuget会读取csproj
文件(将引用节点添加到 csproj
文件中)。
因为安装nuget的时候,会读取csproj
文件的一部分,只会读取header部分的内容,比如Microsoft.Common.props
文件,.props
文件在它之前导入。因此,当您安装 nuget 包时,.props
文件将被完整读取,因此其内容的任何 xml 节点将首先被读取和执行。
所以,安装nuget包就可以了
但是,.targets
会被导入到csproj
文件的底部。所以在安装nuget包的时候,到不了那里,根本就读不到文件,所以只有在建工程的时候才会读到文件。
实际上,.props
文件被读取了两次。一次是在安装nuget的时候,一次是在构建项目的时候,但是.targets
只能在构建项目的时候读取
更新 1
注:
MSBuild的target比较特殊。 copy task 等一些任务是在 目标 下编写的。但是,如果您使用 .props 或 .targets 执行目标,则应该执行构建过程。所以如果你想让目标在nuget包的安装过程中执行,显然是行不通的。你应该执行构建过程来执行它。并且当你安装nuget包时,它不会执行构建过程。
所以前面说了,.props
和.targets
在使用target的时候是一样的。当MSBuild读取.props
或.targets
并输入目标时,由于条件类似于BeforeTargets="Build"
,however,到目前为止,它处于安装过程中,而不是构建过程中。 BeforeTargets="Build"
需要构建过程。所以它会跳过它。
This happens 'once'
表示msbuild在nuget安装过程下先读取文件。它将获取可以将一些文件包含到您的主项目中的属性或项目。 但是目标取决于构建过程,所以MSBuild会在nuget安装过程中跳过它(还没有执行构建)。