C# Nuget Build,何时使用PackageName.Targets和PackageName.props?
给定一个名为example的包文件:C# Nuget Build,何时使用PackageName.Targets和PackageName.props?,c#,visual-studio,nuget,nuget-package,nuget-spec,C#,Visual Studio,Nuget,Nuget Package,Nuget Spec,给定一个名为example的包文件: <?xml version="1.0" encoding="utf-8"?> <package> <metadata> <id>example</id> <version>$version$</version> <title>$title$</title>
<?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>
例子
$version$
$title$
$author$
假的
$description$
$版权所有$
什么时候使用example.targets和example.props
起初,我认为只有在使用Nuget包的项目的构建过程中才需要
但它似乎在安装时使用道具文件
我在我的消费项目中使用了老式的packages.config
任何人都可以告诉我这方面的细节或建议。谢谢。正如我所说
.props添加到项目文件的顶部。目标添加在
底部
将nuget软件包安装到项目中时,将首先读取example.props
因此,属性将在构建过程开始时可用
它通常用于定义新的全局属性或多个新项
它可以在项目中包含一些文件属性和项将在此时执行
example.targets
将在您使用安装的nuget软件包构建项目时读取
Nuget将在Microsoft.Common.props
的早期导入.props
文件
和原则实际上与中描述的相同
更详细地说,当您在项目中安装nuget包时,nuget将读取csproj
文件(将引用节点添加到csproj
文件中)
因为安装nuget时,它将读取
csproj
文件的一部分,并且只读取头部分的内容,例如Microsoft.Common.props
文件,并且在它之前导入.props
文件。因此,当您安装nuget包时,.props
文件将被完整读取,因此其内容的任何xml节点都将首先被读取并执行
因此在安装nuget软件包时,它将起作用
但是,目标将在csproj
文件的底部导入。因此,当安装nuget包时,它无法到达那里,并且文件根本无法读取,因此只有在构建项目时才会读取文件
事实上,.props
文件被读取两次。一次是在安装nuget时,另一次是在构建项目时,但是只有在构建项目时才能读取。目标
更新1
注意:
对于MSBuild的目标,它是特殊的。某些任务(如)写在目标下。但是,如果使用.props或.targets执行目标,则应该执行构建过程。所以,如果您希望在nuget包的安装过程中执行目标,那么它显然不起作用。您应该执行构建过程来执行它。当您安装nuget包时,它不会执行构建过程
正如我之前所说,.props
和.targets
在使用目标时是相同的。当MSBuild读取.props
或.targets
并输入目标时,由于条件类似于BeforeTargets=“Build”
,但是它目前处于安装过程而不是构建过程中。而BeforeTargets=“Build”
需要构建过程。所以它会跳过它
这种情况发生“一次”
意味着msbuild在nuget安装过程中首先读取文件。它将获得可以将一些文件包含到主项目中的属性或项但是目标依赖于构建过程,因此,MSBuild将在nuget安装过程(尚未执行构建)下跳过它。只是为了澄清,在文档中,它只是建议将道具文件添加到项目中。那么,当你说“安装后会工作”是什么意思呢?非常感谢。.props
文件在导入Microsoft.Common.props
之前导入,而.targets
则在csproj文件的底部导入。安装nuget软件包时(它将读取csproj文件的一部分,并将引用节点添加到csproj
)。因此,nuget包只读取顶部。但是,.props
文件是在头文件Microsoft.Common.props
之前导入的,因此在安装nuget软件包时会首先读取该文件。我已用更详细的信息更新了我的答案。你可以查一下。希望它能帮助你更好地理解它:)@PerryQain MSFT-谢谢你的详细回答,尽管我仍然无法理解你对“安装时会起作用”的定义“这是否意味着,如果您在Props文件中放入任何任务,该文件将在Nuget安装过程中运行?在安装过程中使用props文件是否有任何好处,或者这只是它如何更新csproj文件的副作用?我有限的理解是,它只是呈现在构建过程早期定义的任何属性,以便它们可以在构建过程的后期被目标使用?复制任务是在目标下编写的。但是如果使用.props
或.targets
执行目标,则应该执行构建过程。所以,如果您希望在nuget包的安装过程中执行目标,那么它显然不起作用。您应该执行构建过程来执行它。当您安装nuget包时,它不会执行构建过程。