Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nuget Build,何时使用PackageName.Targets和PackageName.props?_C#_Visual Studio_Nuget_Nuget Package_Nuget Spec - Fatal编程技术网

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

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>

给定一个名为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>

例子
$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包时,它不会执行构建过程。