簡體   English   中英

針對不同的平台、架構和.net版本創建Nuget package

[英]Create Nuget package for different platforms, architectures and .net versions

我有一個 C# 7.3 項目Foo ,我想將其發布為 Nuget package。我希望我的 package 可用於不同的架構(x86 和 x64)、不同的平台(Windows 和 Linux)和不同的 .Net 版本(4.8 框架和 5.0) .

Foo C# 代碼本身不包含任何特定於體系結構的代碼,它僅包含純 C# 7.3。 但是這個項目在 Linux 上使用我的自定義平台特定的.dll 和.so(比如ExternalLib.dll / ExternalLib.dll.so )。 每個 Windows x64、Windows x86 等我都有一個。

我知道在 NuGet package 中,您將特定於運行時的組件放在/runtimes文件夾結構中,例如/runtimes/win10-x64/native/ExternalLib.dll 正如文檔所說,這些將僅用於運行時,我需要指定編譯時引用。

我在每個 .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

項目.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命令構建了一個 package。 它沒有錯誤,但是當我將這個 package 添加到任何 .net 項目並嘗試使用它的任何功能時,VS 無法從我的庫中找到任何東西。

我究竟做錯了什么?

我終於做到了。 經過研究,這是我的方法:

  1. 如果您編寫一個 C# 庫,則僅使用 .NetStandard,因此 .Net 和 .NetFramework 應用程序都可以使用您的庫。 我使用了.NetStandard2.0,它可以從.Net5.0 和.NetFramework4.8 中使用。 查看 所有兼容版本。

  2. 清除 NuGet 緩存

  3. 提供xml文檔(可選)

Final.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM