Windows 10 特刊 2015

第 30 卷,第 11 期

本文章是由機器翻譯。

Visual Studio 工具 - NuGet 功能增強 Windows 10 開發

Jeff Fitz |Windows 2015

現在從 NuGet 小組可使用數個新的工具。它包含數個小組曾在 Microsoft 提供新版的 NuGet 用戶端以支援通用 Windows 平台 (UWP) 和新的可攜式類別庫 (PCLs)。新的 NuGet 工具都是透過工具 |擴充功能和更新 |在 Visual Studio 2015 以及 「 NuGet 散發網站中的更新 bit.ly/1MgNt2J。NuGet 也已發行新版的 NuGet 命令列工具可以從 dist.nuget.org 上的相同位置下載。這篇文章會檢閱新功能和 Windows 開發人員不需要遵循的程序將 NuGet 支援新增至其 Windows 10 專案。

Project.Json

從 ASP.NET 5 開始,NuGet 引進了 project.json 檔案來說明清楚定義的封裝,您會立即相依專案相依性的支援。在 ASP.NET 5 這會是唯一可定義專案組態的檔案。透過 NuGet 3.1 不過您使用這個檔案中 Windows 通用專案和現代 PCLs (也就目標 DNX、 UWP 和 Microsoft.NET Framework 4.6) 來定義封裝參考。關於這好消息是專案的 Visual Studio 中的 「 管理套件 」 對話方塊將會適當地維護 packages.config 或 project.json 檔案讓您根據您正在開發類型。

這項轉變從 packages.config 模型也可讓您"reboot"您的專案中的參考並使用 NuGet 的新功能可轉移的相依性。開發人員和封裝的作者報告給 NuGet 小組將封裝加入至專案時, 其 packages.config 檔案成為干擾從其相依封裝的相依性。

例如,NHibernate 是取決於 Iesi.Collections 封裝的封裝。Packages.config,有兩個 NHibernate 和 Iesi.Collections 的參考。當時間來更新 NHibernate 時沒有問題、"也更新 Iesi.Collections? 」 也有相對的問題。我要更新以支援新的功能在 Iesi.Collections NHibernate Iesi.Collections 更新若是? 開發人員會落入這個醜陋週期的管理其專案的封裝相依性被帶到它們透過封裝參考。

NuGet 的可轉移的相依性功能會擷取這項決策與改良在封裝定義檔 (nuspec 文件) 的語意版本設定的支援更新封裝的參考。開發人員指定其封裝支援相依性版本範圍。當 NuGet 來安裝用戶端時,這些相依性的硬式參考至特定版本 packages.config 檔案中加上這些參考的封裝看起來像其他任何封裝參考您已加入您的專案。您可以看到這個問題的絕佳範例 [圖 1

圖 1] ASP.NET MVC packages.config 檔案的內容

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Antlr" version="3.4.1.9004" targetFramework="net46" />
  <package id="bootstrap" version="3.0.0" targetFramework="net46" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net46" />
  <package id="jQuery" version="1.10.2" targetFramework="net46" />
  <package id="jQuery.Validation" version="1.11.1" targetFramework="net46" />
  <package id="KendoUICore" version="2015.2.624" targetFramework="net46" />
  <package id="Microsoft.AspNet.Identity.Core" version="2.2.1" targetFramework="net46" />
  <package id="Microsoft.AspNet.Identity.EntityFramework"
    version="2.2.1" targetFramework="net46" />
  <package id="Microsoft.AspNet.Identity.Owin" version="2.2.1" targetFramework="net46" />
  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform"
    version="1.0.0" targetFramework="net46" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation"
    version="3.2.3" targetFramework="net46" />
  <package id="Microsoft.Net.Compilers"
    version="1.0.0" targetFramework="net46" developmentDependency="true" />
  <package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.Facebook" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.Google" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.MicrosoftAccount"
    version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Owin.Security.Twitter" version="3.0.1" targetFramework="net46" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net46" />
  <package id="Modernizr" version="2.6.2" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net46" />
  <package id="Owin" version="1.0" targetFramework="net46" />
  <package id="Respond" version="1.2.0" targetFramework="net46" />
  <package id="WebGrease" version="1.5.2" targetFramework="net46" />
</packages>

我將這些事情加入至我的專案時,我其實只被需要 Microsoft.AspNet.Mvc、 Microsoft.AspNet.Identity.EntityFramework、 Newtonsoft.Json 和 Microsoft.Owin.Security.MicrosoftAccount。這些四個封裝所參考的其他項目只是噪音,而且現在有硬性參考至特定版本。透過可轉移的相依性功能,這些其他封裝的版本消失。我要離開管理只是我實際上會在我的專案中使用的四個程式庫。

NuGet 用戶端將會解決這些其他封裝在幕後為您並管理保留這些參考在相依的版本封裝使用專案中所宣告的限制範圍內。這可大幅簡化專案參考經驗。

常見的本機封裝快取

開發人員通常會有"戰士"的封裝和偏好的工具。為什麼下載及安裝它們多次在單一工作站上當您已經清楚地在一個專案並想要在另一個使用它們嗎? 專案管理 project.json NuGet 下載並將封裝的複本儲存在位於 %userprofile%\.nuget\packages 資料夾中的全域 packages 資料夾。這應該降低您的工作站上使用的磁碟空間。它也會防止您已經從 NuGet.org 取得項目擷取封裝額外的呼叫。

Project.json 和常見的 ASP.NET 5 使用 NuGet 3.0 以及 NuGet 3.1 從其他專案類型都提供本機套件快取支援。

已被取代的功能

開始 NuGet 3.1 時使用 project.json,取代執行 install.ps1/uninstall.ps1 指令碼和交付項目中 /content 支援封裝資料夾。安裝封裝搭配這些元素將不執行 install.ps1 檔案,也不複製內容到您的專案。不過,仍然使用 packages.config 檔案的專案中目前的行為仍然支援。有幾個原因:

  • 可轉移的封裝還原挑選要解除安裝及安裝是不可能做到可靠。
  • 當將內容複製到使用者專案和封裝會更新時,就會發生隱含解除安裝您不能可靠地執行的程序。
  • NuGet 必須完全支援 Visual Studio 外部的開發。支援完整跨平台的.NET 開發經驗的移動、 使用 Windows Powershell 中並沒有其他環境。更多開發人員也正在 Visual Studio 外部.NET 程式碼和所需的支援。
  • 其他封裝管理員會提供用於管理和傳遞內容的絕佳體驗。以便繼續使用它鼓勵 NuGet 的運作方式以及.NET Framework 中,用來封裝管理員。
  • 不再是"any"架構的支援。您不再可以直接在組建] 和 [lib 資料夾的根目錄上放置檔案並讓它們傳遞至專案。請務必宣告您的檔案支援讓 NuGet 知道的優先順序來解析這些參考的架構。
  • 不再支援方案套件。這些套件不修改任何特定專案的功能和通常用來提供已在專案之間重複使用的共用的資源。以新的共用的封裝資料夾,這些資源可能已被另一個專案從磁碟上。

新的目標架構

這個新版的 NuGet 的另一個層面是新的開發架構的支援以及改良的原生封裝支援 Os 和架構。在到達 NuGet 進一步模型外部之 managed.NET Framework 支援多個生態系統在一起並讓您充分先前無法連線到環境程式庫。

目標 framework moniker (TFM) 是用來建立封裝,以支援哪些架構二進位檔和宣告的相依項目每個架構的速記需要。您可以在封裝的 lib 及使用這個標記法的 ref 資料夾中找到資料夾名稱。也有封裝 nuspec 相依性項目中宣告具有其中一個 TFM 值來傳遞適當的文件庫要使用的專案將 NuGet 用戶端導向的目標 Framework 屬性的項目。

仍會收集下列 TFMs 和所導入新 TFMs 詳列於 [圖 2

[圖 2 的目標架構支援隨 NuGet 3.x

描述 基底程式碼 可用的版本
受管理的架構應用程式 (Windows Form、 主控台應用程式 Windows Presentation Foundation、 ASP.NET) net net11、 net20、 net35、 net35 用戶端、 net35 全文、 net4、 net40、 net40 用戶端、 net40 全文、 net403、 net45、 net451、 net452、 net46
ASP.NET 5 dnxcore dnxcore50
Windows 市集 netcore win8 = netcore45,win81 = netcore451,uap10.0
Windows Phone (appx 模型) wpa wpa81
Windows Phone (Silverlight) wp wp7 = sl3-wp wp71 = sl4 wp71、 sl4 wp、 wp8 = wp8-,wp81
Silverlight sl sl2,sl3 = sl30,sl4 = sl40,sl5 = sl50
Xamarin   單聲道 MonoMac、 Xamarin.Mac、 MonoAndroid10、 MonoTouch10、 Xamarin.iOS10
Compact Framework net cf net20 cf、 net35 cf = cf35,net40 cf
Micro Framework netmf netmf41 netmf42 netmf43

使用等於 (=) 符號列出這些項目是受到 NuGet 的同義字。很多很多不同的架構支援但可能會造成混淆。您需要支援受管理的架構封裝中的微架構嗎? 您需要多少 Silverlight 支援? 您必須回答這些問題以最適合您取用者的需求。

您會注意到沒有任何明確的呼叫來支援 PCLs 資料表中。即使 NuGet 支援這些組合的架構,但是想要有更向前相容性 moniker 的現代 PCLs。如此可讓您建構您的套件和定義您支援的架構中較大的彈性。NuGet 3.1 引進了現代 PCLs dotnet 目標 moniker。

Dotnet 目標 Moniker

在舊版的 NuGet,您可以指定架構與曾擔任 TFM 縮寫與聯結加上符號集合 PCL。您可以得到類似"可攜式 net45 + win8 + wpa81 + wp8。 」 的資料夾名稱 那可能會令人困惑且會導致您取用者不相容性問題。若要簡化 PCL 和跨平台開發經驗,NuGet 會引進 dotnet moniker。

這個 moniker 不是直接繫結至任何特定版本或架構功能。它會告訴 NuGet 的間接參考、 「 這是您應該使用如果它支援您的架構和執行階段功能的參考 」。 NuGet 用戶端然後調查該參考來判斷功能和它所支援的架構。此程序會繼續直到 NuGet 用戶端解析 dotnet 參考所支援的完整功能。它會再將它套用如果且只有它會比對的功能和專案的需求。您可以參考.NET Framework 4.5 dotnet moniker 和稍後衍生包括 Xamarin Android 和 Xamarin iOS 的 framework 版本。

這並不表示您可以只建置 PCL,它與宣告 dotnet 相依性並進行的組合。如果您想要能夠支援使用舊版的 Visual Studio 和 NuGet 用戶端建立與傳統的可攜式類別庫專案,您仍應該建立和放置完整 PCL 目標 framework moniker 的參考。

當將封裝安裝到與 dotnet moniker (.NET Framework 4.6、 UWP 或 ASP.NET 5) 完全相容的專案類型,將上一次搜尋 dotnet moniker。都會在下班之後嘗試尋找符合的架構或較不特定架構您的專案的參考。這個階層如下所示 [圖 3

檢查 Windows 通用平台專案的參考架構的階層架構
[圖 3 的架構檢查其中有參考 Windows 通用平台專案的階層架構

如果您的專案是使用 project.json 為目標的這些架構而且沒有其他任何現代 PCL,就會先分析 dotnet moniker。後面接著的標準 PCL 解析策略中所示 [圖 4

檢查其中有最新的可攜式類別庫專案中參考架構的階層架構
[圖 4 的架構檢查其中有最新的可攜式類別庫專案中參考的階層架構

NuGet 命令列

類似指令可執行檔的 NuGet nuget.exe,現已開放下載與安裝、 更新和 packages.config 或 project.json 檔案還原至專案的封裝的支援。組件命令會繼續使用磁碟上的 nuspec 檔案及 packages.config 檔案。它尚未更新來產生 nuspec 檔案 project.json 檔案為基礎。若要解決這個問題,您需要製作您自己的 nuspec 檔案您建構 project.json 封裝參考任何新封裝內容。未來版本將會包含為解決此問題的更新。

這個版本的命令列可執行檔也支援 NuGet.org v3 端點。這個新版本的摘要 nuget.org 提供更快速的互動且更可靠的服務。沒有內建備援能力與啟用以協助您快速提供封裝的內容傳遞網路。下載一份在更新 NuGet.exe bit.ly/1UV0kcU

如果您已經安裝 Windows 10 SDK/Windows 10 工具升級 NuGet 延伸模組之後,安裝程式會降級回版本 3.1 延伸模組。您必須再次更新至最少 3.1.1。在擴充功能和更新] 對話方塊中顯示的版本是 3.1.60724.766。Windows PowerShell 主控台是 3.1.1.0。

總結

這些功能可支援 Windows 10 UWP 應用程式開發和 PCL 專案現在可用。這些變更會位於更廣泛的運用封裝管理員和.NET Framework 中的第一個步驟。Microsoft 將持續改善.NET 開發經驗,並會將焦點放在建置專案的任何類型的任何平台上支援所有的.NET 開發人員使用封裝管理員。


Jeffrey T Fritz是 Microsoft 的 NuGet 小組的資深專案經理。他喜歡定域機組中調整海灘和殺手 Web 應用程式的長查核行程。與他連絡 jefritz@microsoft.com

衷心感謝以下技術專家對本文的審閱: Microsoft 的 NuGet 小組的成員