Nuget Build,何时使用PackageName.Targets和PackageName.props?

问题描述

给出一个名为example的软件包文件

<?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所说的那样,

.props添加在项目文件的顶部; .targets添加在 底部。

将nuget软件包安装到项目中时,将首先阅读

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安装过程(尚未执行构建)下跳过该目标。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...