我正在开发一个 C# 库 (LLamaSharp),它包装了一个 C++ 库 (llama.cpp)。
作为 nuget 包的一部分,我们包含使用所有各种类型的硬件支持(CUDA、OpenCL、Vulkan、AVX/AVX2/AVX512 等)编译的 DLL。在运行时,为可用硬件选择最好的后端。
您可以在此处查看当前文件夹层次结构以及其中的所有后端。自动选择取决于此精确布局,以便能够找到相关的 DLL。用于构建包的 nuspec 文件位于here。
但是,使用当前设置,在发布“自包含”构建时会失败(在 Visual Studio 中:“构建”>“发布”,将部署模式设置为“自包含”)。它会产生这个错误:
Found multiple publish output files with the same relative path:
- llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx\llama.dll,
- llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx2\llama.dll,
- llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\avx512\llama.dll,
- llamasharp.backend.cpu\0.11.1\runtimes\win-x64\native\llama.dll
整个文件夹层次结构似乎被构建过程压平了。这会导致立即生成错误(多个文件进入同一位置),并且还会导致运行时选择失败(文件未放置在正确的文件夹中)。
通过 nuget 分发 DLL 的文件夹层次结构并在最终构建中保留结构的正确方法是什么?
要将 DLL 文件夹保留在 NuGet 包中,请执行以下操作 >>
编辑
文件。添加带有路径的 DLL。 使用.nuspec
设置路径。contentFiles
示例:
<files>
<file src="runtimes\win-x64\native\avx\llama.dll" target="runtimes\win-x64\native\avx\llama.dll" />
<file src="runtimes\win-x64\native\avx2\llama.dll" target="runtimes\win-x64\native\avx2\llama.dll" />
<file src="runtimes\win-x64\native\avx512\llama.dll" target="runtimes\win-x64\native\avx512\llama.dll" />
<file src="runtimes\win-x64\native\llama.dll" target="runtimes\win-x64\native\llama.dll" />
</files>
这样可以保持文件夹结构并且不会出现扁平问题。