代码之家  ›  专栏  ›  技术社区  ›  aybe

无法将LICENSE/README添加到NuGet包:错误NU5030

  •  0
  • aybe  · 技术社区  · 3 年前

    我有以下 .targets 我导入的多个文件 .csproj 项目:

    <Project>
        <PropertyGroup>
            ...         
            <PackageLicenseFile>LICENSE</PackageLicenseFile>
            <PackageReadmeFile>README.md</PackageReadmeFile>
            ...         
        </PropertyGroup>
    </Project>
    

    二者都 LICENSE README.md 文件就在旁边 .目标 位于存储库根目录下的文件。

    但我得到了以下错误:

    错误NU5030:许可证文件“C:\…”。。。\blah\LICENSE'在包中不存在。[C:\…\bah\whatever\whatever.csproj]

    参考文件:

    问题:

    如何将这两个文件打包到NuGet包中?

    1 回复  |  直到 3 年前
        1
  •  3
  •   aybe    3 年前

    终于找到了原因 thanks to a clue in the docs 尽管这还不足以让它发挥作用。

    不仅必须有 ItemGroup 也一样,但这些 $(MSBuildThisFileDirectory) :

    <Project>
    
        <PropertyGroup>
            <PackageLicenseFile>LICENSE</PackageLicenseFile>
            <PackageReadmeFile>README.md</PackageReadmeFile>
        </PropertyGroup>
    
        <ItemGroup>
            <None Include="$(MSBuildThisFileDirectory)LICENSE" Pack="true" PackagePath="" />
            <None Include="$(MSBuildThisFileDirectory)README.md" Pack="true" PackagePath="" />
        </ItemGroup>
    
    </Project>
    
        2
  •  2
  •   mkjeldsen Mohammed Azharuddin Shaikh    3 年前

    为了概括这个问题的公认答案 https://stackoverflow.com/a/75622542/482758 ,及其交叉柱 https://github.com/NuGet/Home/issues/12463 :

    中指定的许可证文件 PackageLicenseFile build属性必须“包含在包中”,但这样做的机制很微妙,而且文档也很差。

    1. 许可证文件通常属于软件包中未包含的类型 默认情况下 ,因此需要通过 None 项目( 没有一个 因为该文件不需要特殊处理)。
      • 传递到包含项的路径是文件的正确路径,其形式为从包含项的生成时评估位置开始的绝对路径或相对路径。
        • 用于帮助指定此路径的常见属性包括 SolutionDir ,通常是项目根; MSBuildThisFileDirectory ,是的目录 包含文件 ;和 MSBuildProjectDirectory ,是的目录 正在建设的项目
    2. 除了选择包含外,文件包含通常不能通过 IncludeContentInPack ,其值必须为 true 并且默认为 真实的
    3. 这个 PackagePath include项的属性确定许可证文件在包中显示的虚拟路径,如果保留为空,则计算为原始文件名。
    4. 这个 软件包许可证文件 的值必须指向已解析的 程序包路径 价值

    这个问题的公认答案之所以有效,是因为许可证文件不是通过某些包含项(例如。 没有一个 )。我们可以得出这样的结论,因为试图打包包含不存在的文件路径的项目会产生 NU5019: File not found 错误此外 $(MSBuildThisFileDirectory)LICENSE 之所以有效,是因为该目录同时包含 .targets 文件以及许可证文件(该路径在 .csproj 文件)。

    答案 https://stackoverflow.com/a/75622542/482758 工作,因为作者已手动禁用 包含内容InPack 因此任何配置都不可能工作。当作者纠正该特定错误时,许可证文件已被重新定位到与包含包含项的文件相同的目录中,因此该答案不再回答许可证文件位于祖先目录中的原始问题。

    总结如下:

    如果你有 LICENSE.txt 文件位于与 .sln 文件中,则无论将以下配置放在哪个属性文件中,它都将起作用( Directory.Build.props , Directory.Build.targets 另外 .props .目标 , .csproj公司 )以下为:

      <PropertyGroup>
        <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
      </PropertyGroup>
    
      <ItemGroup>
        <None Include="$(SolutionDir)LICENSE.txt" Pack="true" PackagePath="" />
      </ItemGroup>
    

    如果许可证文件不在解决方案目录中,或者不在可以从解决方案目录轻松访问的目录中,则其他构建属性之一可能更方便。如果文件恰好位于 .csproj公司 目录中,根本不需要路径前缀。