无法将许可证/自述文件添加到 NuGet 包:错误 NU5030

问题描述 投票:0回答:3

我有以下

.targets
文件,我将其导入到多个
.csproj
项目中:

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

LICENSE
README.md
文件都位于存储库根目录下的
.targets
文件旁边。

但是我收到以下错误:

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

参考文档:

问题:

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

c# nuget
3个回答
3
投票

终于找到了原因感谢文档中的线索尽管这还不足以让它工作。

不仅必须有

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
投票

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

PackageLicenseFile
构建属性中指定的许可证文件必须“包含在包中”,但这样做的机制很微妙并且记录很少。

  1. 许可证文件通常是不包含在包中的类型默认情况下,因此需要通过
    None
    项显式包含(
    None
    因为该文件不需要特殊处理)。
    • 传递给包含项的路径是文件的正确路径,其形式可以是绝对路径,也可以是从包含项的构建时评估位置开始的相对路径。
      • 帮助指定此路径的常见属性包括
        SolutionDir
        ,通常是项目根;
        MSBuildThisFileDirectory
        ,这是包含文件的目录;和
        MSBuildProjectDirectory
        ,这是正在构建的项目的目录。
  2. 除了选择包含之外,一般不得通过
    IncludeContentInPack
    禁用文件包含,其值必须为
    true
    ,默认为
    true
  3. 包含项的
    PackagePath
    属性确定许可证文件出现在包中的虚拟路径,如果留空,则计算结果为原始文件名。
  4. PackageLicenseFile
    的值必须指向已解析的
    PackagePath
    值。

这个问题的公认答案有效,因为许可证文件并不是首先通过某些包含项(例如

None
)明确包含的。我们可以得出这样的结论,因为尝试打包包含不存在的文件路径的项目会产生
NU5019: File not found
错误。此外,
$(MSBuildThisFileDirectory)LICENSE
的特定值有效,因为该目录包含
.targets
文件和许可证文件(该路径在
.csproj
文件内会被错误解析)。

答案https://stackoverflow.com/a/75622542/482758有效,因为作者手动禁用了

IncludeContentInPack
,因此任何配置都无法工作。当作者更正该特定错误时,许可证文件已被重新定位到与包含包含项的文件相同的目录,因此该答案不再回答原始问题,其中许可证文件位于祖先目录中。

总结一下:

如果

LICENSE.txt
文件与
.sln
文件位于同一目录中,则无论将其放置在哪个属性文件中,以下配置都将起作用(
Directory.Build.props
Directory.Build.targets
、其他
.props
.targets
.csproj
):

  <PropertyGroup>
    <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
  </PropertyGroup>

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

如果许可证文件不在解决方案目录中,或者不在解决方案目录中可以轻松访问的目录中,则其他构建属性之一可能会更方便。如果文件恰好位于

.csproj
目录中,则根本不需要路径前缀。


0
投票

在这里分享另一个答案,因为接受的答案对我不起作用。 如果您有类似的文件夹结构,如下所示:

[+] ProjectFolder/
  - LICENSE
  - README
 [+] src/
   - Project.csproj
   - Project.sln
   ...
 [+] test/
   ...

在 .csproj 中添加以下内容

<ItemGroup>
  <None Include="..\LICENSE">
    <Pack>True</Pack>
      <PackagePath></PackagePath>
  </None>
</ItemGroup>
© www.soinside.com 2019 - 2024. All rights reserved.