我编写了一个 .NET7 库,它使用 P/Invoke 来执行两个第三方库中的支持功能,在本例中为
.so
文件,因为消费产品将仅部署到 Linux。
我已使用以下项目定义成功将这些文件打包到 Nuget 文件中:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<PackageId>my.library.name</PackageId>
<Title>My Library</Title>
<Authors>Me</Authors>
<Company>My Company</Company>
<Product>The Library</Product>
</PropertyGroup>
<ItemGroup>
<Content Include="../res/liblib1.so" Pack="true" PackagePath="contentFiles/any/any">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
<Content Include="../res/liblib2.so" Pack="true" PackagePath="contentFiles/any/any">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<PackageCopyToOutput>True</PackageCopyToOutput>
</Content>
</ItemGroup>
</Project>
但是,当构建并发布 consuming 项目时,.so 文件就看不到了。 这个答案中详细介绍的解决方案没有让我得到任何帮助,并且该项目中定义的 PackagePath 是阅读 learn.microsoft.com 关于跨版本兼容性的文章的结果(尽管这两个项目都使用 .NET7) .
我希望 .so 文件出现在可执行文件及其关联的 DLL 附近,或者最坏的情况是出现在子文件夹中,因此我必须调整构建脚本来重新定位它们。 相反,它们不会被复制到all。
我通过解压 nuget 包确认这些文件存在于
contentfiles/any/any
中,正如 PackagePath
元素所预期的那样,但它们没有包含在使用项目的构建产品中。
(我使用 Visual Studio 2022 作为 IDE 和编译器。)
如果您想将内容文件包含在使用项目的构建产品中,您可以直接从Nuget包中复制文件。
1.为
<GeneratePathProperty>true</GeneratePathProperty>
(my.library.name) 添加 PackageReference
生成独占属性 $(Pkgmy.library.name) 来获取 nupkg 内容的路径。
<PackageReference Include="TestLibrary" Version="1.0.0" >
<GeneratePathProperty>true</GeneratePathProperty>
</PackageReference>
2.添加CopyFiles目标。这会将文件复制到“$(ProjectDir