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 它可以将一些文件包含到您的项目中。 Propertiesitems将在此时执行。

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安装过程中跳过它(还没有执行构建)。