2017-05-25 111 views
0

我構建了很多具有跨平臺定位的軟件包。我喜歡使用NuGet作爲所有明顯原因的部署,但我很難理解如何針對Linux上的Mono特定二進制文件。Visual Studio和NuGet針對Linux上的Mono

作爲一個例子,我有一個庫,在Mono for Linux版本中,引用`Mono.Posix.Helper.dll。這在Linux上是Mono特有的。它不適用於桌面。它不適用於Android上的Mono或iOS上的Mono。同一個庫有不同的桌面.NET,Windows CE上的.NET,Android上的Mono和iOS上的Mono。

看來,我需要兩樣東西,無論它的,我可以似乎找到:

  1. 辦法告訴的NuGet是二進制的一組特定的目標單在Linux上。我在official documentation of the NuGet schema target frameworks中看不到任何東西。
  2. 一種告訴Visual Studio的方法,即將使用這些二進制文件的項目以Linux上的Mono爲目標。我發現了this nice list of project GUIDs,但是,當然,Mono沒有針對Android或iOS的內容。

現在我正在用友好的後期構建任務來解決這個問題,但是當我需要創建一個使用這些包之一的新項目時,這真的不是很有趣。

我知道微軟在過去幾年一直試圖讓Linux更友好,但這似乎是一個很大的漏洞。我不能成爲這裏唯一一個爲Linux上的Mono構建代碼的人,對嗎?這裏有什麼解決方案?

+0

你可以把你的後期構建任務變成一個MSBuild任務與關聯的.targets文件,然後將其包含到你的NuGet包中?當您安裝NuGet包時,MSBuild .targets文件將被導入到項目中。所以你的NuGet包的用戶不需要自己做任何事情就安裝它。 –

回答

1

目前,這是不可能的。 (3. *,4)的確有一個「運行時」的概念,但是它們指的是運行時運行的操作系統。因此,儘管您可以擁有linux-x64的特定資產,但無法確定您是使用mono還是.net核心。實際上,即使在使用net461目標框架與runtimes/linux-x64/lib/net461/linux-specific.dll文件時,甚至可能會在.NET Core 2.0應用程序中使用它,因爲.NET Core 2.0可以使用net461 +庫。

目前可行的唯一方法是擁有可以在運行時解決正確程序集的託管填充程序。這也會使消費項目變得「便攜」 - 這意味着假設所有庫都可以動態加載,它可以通過單聲道直接在Linux和Linux上運行。

+0

呃。不幸的是,這是我期望聽到的 - 雖然不是我真正想聽到的。也許有一天微軟會得出這樣的結論:是的,我們確實使用這些東西並添加了支持。 – ctacke

+0

在https://github.com/NuGet/Home/issues/2320創建單目標框架存在一個問題,但除此之外,只有Xamarin目標框架標識符。 –