【问题标题】:NuGet v4 contentFiles not getting copied to outputNuGet v4 contentFiles 没有被复制到输出
【发布时间】:2020-03-05 03:06:37
【问题描述】:

我在使用 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 中,有一个 contentFiles 目录,其中包含 StyleCop.ruleset 文件,这样就可以了。

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

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

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

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

【问题讨论】:

    标签: nuget nuget-package nuget-package-restore nuget-spec


    【解决方案1】:

    我遇到了这个问题,当时我进行了很多更改,但没有任何效果。最后用PackageReferences解决了

    packages.config 项目使用content/ PackageReference 项目使用contentFiles/

    您可以在此处找到有关不可变内容的更多信息:

    ContentFilesExample

    nuget-contentFiles-demystified

    1. 通过packages.config 引用 nuget 的现有项目
    2. 已安装带有内容文件的 NuGet 包
    3. 构建项目
    4. 输出目录中没有内容文件

    5. packages.config 转换为PackageReferences
    6. 构建项目
    7. 内容文件已复制到输出目录

    IDE 是 Visual Studio 2017。该项目是一个应用程序项目,这意味着它是旧的csproj 格式。

    更新答案

    GeneratePathProperty 属性已添加到 PackageReference

    <PackageReference Include="EO.Pdf" GeneratePathProperty="true">
        <Version>19.0.83</Version>
    </PackageReference>
    

    检查您的 \obj\.csproj.nuget.g.props 以验证变量是否已生成

    变量以 Pkg 为前缀。听起来它们是为所有带有工具文件夹的 nuget 包自动生成的。

    【讨论】:

    • 是的,我们的项目已经在 .csproj 中使用了 PackageReferences。我们不使用 packages.config。我将编辑问题以添加它。
    • @jacob21 我已经更新了答案。另外,请您参考here
    • 不幸的是,这也没有什么不同。
    【解决方案2】:

    contentFilesPackageReferencecontentpackages.config 的工作方式根本不同。使用packages.config,您必须使用工具(Visual Studio)来安装包,并且在安装时,NuGet 会将content 复制到项目目录以及它需要的任何其他更改(例如告诉项目系统修改 csproj )。使用packages.config,恢复在概念上与安装不同,所有恢复操作都是将包解压缩到预期的位置,以便lib/&lt;tfm&gt;/*.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,它们应该出现在解决方案资源管理器中,但是如果单击文件将其打开,它将以只读模式打开,因为对使用的全局包文件夹进行特定于项目的更改会很糟糕通过计算机上的所有项目。因此,从概念上讲,它类似于在每次构建时复制文件,并且为了阻止使用项目的开发人员进行更改,它不会费心将文件复制到目录中。这也意味着检查源代码控制的工作更少。

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

    【讨论】:

    • 是的,实际上我昨天自己解决了所有这些问题。我使用 .nuspec &lt;contentFiles&gt;&lt;files include="**/*.*" buildAction="None" copyToOutput="true" flatten="true" /&gt;&lt;/contentFile&gt;&lt;file src="content\**" target="contentFiles\any\any" /&gt;.. 然后在 .props 文件中 &lt;CodeAnalysisRuleSet&gt;$(MSBuildThisFileDirectory)..\content\StyleCop.ruleset&lt;/CodeAnalysisRuleSet&gt;.. 无法编辑 stylecop 文件实际上是理想的,因为它可以防止人们进行意外更改。谢谢!
    • 好详细的解释
    【解决方案3】:

    这是解决此问题的另一个答案:

    https://stackoverflow.com/a/68243917/56621

    TL;DR - 将文件打包到包中时,请确保遵循目标框架/语言的“任意/任意”命名约定,否则将无法正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多