我有以下
.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 包中?
终于找到了原因感谢文档中的线索尽管这还不足以让它工作。
不仅必须有
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>
为了概括这个问题的公认答案,重复的https://stackoverflow.com/a/75622542/482758,及其交叉帖子https://github.com/NuGet/Home/issues/12463 :
PackageLicenseFile
构建属性中指定的许可证文件必须“包含在包中”,但这样做的机制很微妙并且记录很少。
None
项显式包含(None
因为该文件不需要特殊处理)。
SolutionDir
,通常是项目根; MSBuildThisFileDirectory
,这是包含文件的目录;和MSBuildProjectDirectory
,这是正在构建的项目的目录。IncludeContentInPack
禁用文件包含,其值必须为 true
,默认为 true
。PackagePath
属性确定许可证文件出现在包中的虚拟路径,如果留空,则计算结果为原始文件名。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
目录中,则根本不需要路径前缀。
在这里分享另一个答案,因为接受的答案对我不起作用。 如果您有类似的文件夹结构,如下所示:
[+] ProjectFolder/
- LICENSE
- README
[+] src/
- Project.csproj
- Project.sln
...
[+] test/
...
在 .csproj 中添加以下内容
<ItemGroup>
<None Include="..\LICENSE">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>