为不同的平台、架构和 .net 版本创建 Nuget 包
Create Nuget package for different platforms, architectures and .net versions
我有一个 C# 7.3 项目 Foo
,我想将其发布为 Nuget 包。我希望我的包可用于不同的体系结构(x86 和 x64)、不同的平台(Windows 和 Linux)和不同的 .Net 版本(4.8 框架和 5.0)。
Foo
C# 代码本身不包含任何特定于体系结构的代码,它仅包含纯 C# 7.3。但是这个项目在 Linux(比如 ExternalLib.dll
/ ExternalLib.dll.so
)上使用我自定义的特定于平台的 .dll 和 .so。每个 Windows x64、Windows x86 等我都有一个
我知道在 NuGet 包中,您将特定于运行时的组件放置在 /runtimes
文件夹结构中,例如 /runtimes/win10-x64/native/ExternalLib.dll
。正如 documentation 所说,这些将仅用于运行时,我需要指定编译时引用。
我在每个 net4.7 和 net5.0 的 Any CPU
配置中构建了我的 Foo
项目,并将每个 Foo.dll
放在 /lib
文件夹中。所以我最终的模块文件夹结构是
Project.nuspec
/lib
/net4.7/Foo.dll
/net5.0/Foo.dll
/runtimes
/win10-x64/native/ExternalLib.dll
/win10-x86/native/ExternalLib.dll
/linux-x64/native/ExternalLib.dll.so
Project.nuspec:
<?xml version="1.0" encoding="utf-8"?>
<package>
<metadata>
/* */
<dependencies>
<group targetFramework=".NETFramework4.8" />
<group targetFramework="net5.0" />
</dependencies>
</metadata>
</package>
我使用 nuspec pack Project.nuspec
命令构建了一个包。它没有错误,但是当我将这个包添加到任何 .net 项目并尝试使用它的任何功能时,VS 无法从我的库中找到任何东西。
我做错了什么?
我终于做到了。经过研究,这是我的做法:
如果您编写 C# 库,请仅使用 .NetStandard,这样 .Net 和 .NetFramework 应用程序都可以使用您的库。我使用了 .NetStandard2.0,它可以在 .Net5.0 和 .NetFramework4.8 中使用。有关所有兼容版本,请参阅 this。
清除 NuGet 缓存
提供 xml 文档(可选)
最终 .nuspec 文件:
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
...
<dependencies>
<group targetFramework="netstandard2.0" />
</dependencies>
</metadata>
<files>
<!--Path to documentaion and AnyCPU builded dll-->
<file src="Doc\Api.xml" target="lib\netstandard2.0"/>
<file src="bin\x86\Release\netstandard2.0\Foo.dll" target="lib\netstandard2.0"/>
<!--Path to x86 builded ExternalLib and Foo-->
<file src="build\x86-Release\ExternalLib.dll" target="runtimes\win-x86\native" />
<file src="bin\x86\Release\netstandard2.0\Foo.dll" target="runtimes\win-x86\native" />
<!--Path to x64 builded ExternalLib and Foo-->
<file src="build\x64-Release\ExternalLib.dll" target="runtimes\win-x64\native" />
<file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\win-x64\native" />
<!--Path to x64 builded ExternalLib(for linux) and Foo(same as windows)-->
<file src="build\x64-Release\ExternalLib.so" target="runtimes\linux-x64\native\ExternalLib.dll.so" />
<file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\linux-x64\native" />
</files>
</package>
我有一个 C# 7.3 项目 Foo
,我想将其发布为 Nuget 包。我希望我的包可用于不同的体系结构(x86 和 x64)、不同的平台(Windows 和 Linux)和不同的 .Net 版本(4.8 框架和 5.0)。
Foo
C# 代码本身不包含任何特定于体系结构的代码,它仅包含纯 C# 7.3。但是这个项目在 Linux(比如 ExternalLib.dll
/ ExternalLib.dll.so
)上使用我自定义的特定于平台的 .dll 和 .so。每个 Windows x64、Windows x86 等我都有一个
我知道在 NuGet 包中,您将特定于运行时的组件放置在 /runtimes
文件夹结构中,例如 /runtimes/win10-x64/native/ExternalLib.dll
。正如 documentation 所说,这些将仅用于运行时,我需要指定编译时引用。
我在每个 net4.7 和 net5.0 的 Any CPU
配置中构建了我的 Foo
项目,并将每个 Foo.dll
放在 /lib
文件夹中。所以我最终的模块文件夹结构是
Project.nuspec
/lib
/net4.7/Foo.dll
/net5.0/Foo.dll
/runtimes
/win10-x64/native/ExternalLib.dll
/win10-x86/native/ExternalLib.dll
/linux-x64/native/ExternalLib.dll.so
Project.nuspec:
<?xml version="1.0" encoding="utf-8"?>
<package>
<metadata>
/* */
<dependencies>
<group targetFramework=".NETFramework4.8" />
<group targetFramework="net5.0" />
</dependencies>
</metadata>
</package>
我使用 nuspec pack Project.nuspec
命令构建了一个包。它没有错误,但是当我将这个包添加到任何 .net 项目并尝试使用它的任何功能时,VS 无法从我的库中找到任何东西。
我做错了什么?
我终于做到了。经过研究,这是我的做法:
如果您编写 C# 库,请仅使用 .NetStandard,这样 .Net 和 .NetFramework 应用程序都可以使用您的库。我使用了 .NetStandard2.0,它可以在 .Net5.0 和 .NetFramework4.8 中使用。有关所有兼容版本,请参阅 this。
清除 NuGet 缓存
提供 xml 文档(可选)
最终 .nuspec 文件:
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
...
<dependencies>
<group targetFramework="netstandard2.0" />
</dependencies>
</metadata>
<files>
<!--Path to documentaion and AnyCPU builded dll-->
<file src="Doc\Api.xml" target="lib\netstandard2.0"/>
<file src="bin\x86\Release\netstandard2.0\Foo.dll" target="lib\netstandard2.0"/>
<!--Path to x86 builded ExternalLib and Foo-->
<file src="build\x86-Release\ExternalLib.dll" target="runtimes\win-x86\native" />
<file src="bin\x86\Release\netstandard2.0\Foo.dll" target="runtimes\win-x86\native" />
<!--Path to x64 builded ExternalLib and Foo-->
<file src="build\x64-Release\ExternalLib.dll" target="runtimes\win-x64\native" />
<file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\win-x64\native" />
<!--Path to x64 builded ExternalLib(for linux) and Foo(same as windows)-->
<file src="build\x64-Release\ExternalLib.so" target="runtimes\linux-x64\native\ExternalLib.dll.so" />
<file src="bin\x64\Release\netstandard2.0\Foo.dll" target="runtimes\linux-x64\native" />
</files>
</package>