gpt4 book ai didi

NuGet v4 contentFiles 没有被复制到输出

转载 作者:行者123 更新时间:2023-12-03 21:17:31 26 4
gpt4 key购买 nike

我在使用 NuGet v4 CLI 将文件复制到输出时遇到了问题。

我的目录结构如下所示:

repo
repo\CodeAnalyzer.nuspec
repo\CodeAnalyzer.props
repo\contentFiles\any\any\StyleCop.ruleset

这是我的 CodeAnalyzer.props 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PackageName>CodeAnalyzer</PackageName>
<PackageVersion>0.1.0</PackageVersion>
</PropertyGroup>
<PropertyGroup>
<CodeAnalysisRuleSet>StyleCop.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>

和 CodeAnalyzer.nuspec 文件:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>CodeAnalyzer</id>
<description>Provides standard code analyzer tooling and customisation.</description>
<authors>Me</authors>
<version>0.1.0</version>
<dependencies>
<dependency id="StyleCop.Analyzers" version="1.1.118" />
</dependencies>
<contentFiles>
<files include="any/any/*" buildAction="Content" copyToOutput="true" flatten="false" />
</contentFiles>
</metadata>
<files>
<file src="contentFiles\any\any\StyleCop.ruleset" target="contentFiles" />
<file src="CodeAnalyzer.props" target="build" />
</files>
</package>

在 CLI 上,我使用以下方法打包:
.\nuget.exe pack .\CodeAnalyzer.nuspec
在生成的 .nupkg 中,有一个包含 StyleCop.ruleset 文件的 contentFiles 目录,因此可以正常工作。

如果我然后在项目中安装该包,它会很好地获取 StyleCop.Analyzers 依赖项,并查找 StyleCop.ruleset 文件,因此 .props 文件很好。

但是 StyleCop.ruleset 文件没有放在任何地方。

感觉我已经尝试了很多将 buildActions 更改为 None/Content,将 copyToOutput 更改为 true/false,contentFiles.file 元素和 file.file 元素的不同路径。

编辑:消费项目使用的是 NuGet 包的 PackageReferences,而不是 packages.config。

最佳答案

contentFilesPackageReference工作原理与 content 完全不同与 packages.config .与 packages.config ,您必须使用工具 (Visual Studio) 来安装包,并且在安装时,NuGet 将复制 content到项目目录和它需要的任何其他更改(例如告诉项目系统修改 csproj)。与 packages.config恢复在概念上与安装不同,所有恢复所做的就是将包解压缩到预期位置,以便 lib/<tfm>/*.dll程序集在编译时可用。

PackageReference可以手动编辑 csproj,而无需工具知道发生了这种情况。这意味着当 NuGet 执行还原时,它不知道这是第一次为项目还原特定包,还是第一次在此计算机上还原(实际上,NuGet 甚至不检查项目的现有状态)机器上的项目,因此目前不知道该包是否已在当前计算机上的项目中恢复)。尽管您仍然可以使用工具(Visual Studio 或 dotnet add package),但这只不过是一种编辑 csproj 的便捷方式。这是一个很长的路要说安装与恢复的概念不再存在于 PackageReference .现在只有恢复。

由于 PackageReference 不再存在安装的概念,如果 NuGet 要将文件复制到消费项目的目录,那么如何处理内容文件是一个很大的问题。如果 NuGet 每次还原都复制文件,这意味着如果项目的开发人员修改了文件,他们将在下一次 NuGet 还原时丢失更改。如果 NuGet 不覆盖文件,则当项目更改包版本时,不会更新新包中的新内容。

所以,方式是contentFiles工作是 NuGet 告诉构建系统有关这些文件的信息,并且它们被用作来自全局包文件夹的链接。在 .NET Framework TFM 的构建时或 .NET Core TFM 的发布时,文件将复制到输出目录。但是它们绝不会被复制到项目目录中。如果使用 Visual Studio,它们应该出现在解决方案资源管理器中,但是如果您单击一个文件来打开它,它将以只读模式打开,因为对使用的全局包文件夹进行项目特定的更改是不好的通过计算机上的所有项目。因此,从概念上讲,它类似于在每次构建时复制文件,并且为了阻止使用项目的开发人员进行更改,它不会将文件复制到目录中。这也意味着检查源代码管理的工作更少。

由于您使用的内容文件是构建时 Assets ,而不是运行时 Assets ,我建议 contentFiles不是放置规则集文件的正确位置。我只是把它放在 build/您的 props 旁边的目录文件。由于您的 props file 没有指定规则集文件的路径,我相信它告诉 MSBuild 在 props 文件的目录中查找,所以它会起作用。最坏的情况是您将其更改为 $(MSBuildThisFileDirectory)StyleCop.ruleset .这是假设您对无法修改规则集文件的消费项目没问题。如果您确实希望他们能够修改文件,那么 NuGet 不是合适的交付机制,我建议您查看 dotnet new item templates反而。

关于NuGet v4 contentFiles 没有被复制到输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58767292/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com