Visual Studio 專案和專案範本通常需要確保在建立專案或專案時安裝特定套件。 例如,ASP.NET MVC 3 範本會安裝 jQuery、Modernizr 和其他套件。
若要支援此專案,範本作者可以指示 NuGet 安裝必要的套件,而不是個別程式庫。 然後,開發人員可以在以後隨時輕鬆更新這些套件。
若要深入瞭解撰寫範本本身,請參閱 如何:建立專案範本 或 建立自訂專案和專案範本。
本節的其餘部分說明撰寫範本以正確包含 NuGet 套件時要採取的特定步驟。
Samples
Preinstalled-Packages 範例可在 GitHub 上的 NuGet/Samples 存放庫中使用。
將套件新增至範本
具現化範本時,會呼叫 範本精靈 來載入要安裝的套件清單,以及尋找這些套件位置的相關資訊。 套件可以內嵌在 VSIX 中、內嵌在範本中,或位於本機硬碟上,在此情況下,您可以使用登錄機碼來參考檔案路徑。 有關這些位置的詳細信息將在本節後面提供。
預先安裝的套件使用 範本精靈運作。 當範本具現化時,會叫用特殊精靈。 精靈會載入需要安裝的套件清單,並將該資訊傳遞至適當的 NuGet API。
在範本中包含套件的步驟:
在您的
vstemplate檔案中,新增一個WizardExtension元素以參考 NuGet 範本精靈:<WizardExtension> <Assembly>NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</Assembly> <FullClassName>NuGet.VisualStudio.TemplateWizard</FullClassName> </WizardExtension>NuGet.VisualStudio.Interop.dll是一個僅包含TemplateWizard類別的程序集,它是一個簡單的包裝器,用來呼叫NuGet.VisualStudio.dll中的實際實作。 元件版本永遠不會更改,以便專案/項目範本繼續使用新版本的 NuGet。新增要在專案中安裝的套件清單:
<WizardData> <packages> <package id="jQuery" version="1.6.2" /> </packages> </WizardData>精靈支援多個
<package>元素,以支援多個套件來源。 和idversion屬性都是必需的,這表示即使有較新的版本可用,也會安裝套件的特定版本。 這可防止套件更新中斷範本,讓開發人員選擇使用範本更新套件。指定 NuGet 可以尋找套件的存放庫,如下列各節所述。
VSIX 套件存放庫
Visual Studio 專案/專案範本的建議部署方法是 VSIX 延伸模組 ,因為它可讓您將多個專案/專案範本封裝在一起,並允許開發人員使用 VS 延伸模組管理員或 Visual Studio 資源庫輕鬆探索您的範本。 延伸模組的更新也很容易使用 Visual Studio 延伸模組管理員自動更新機制來部署。
VSIX 本身可以作為範本所需套件的來源:
在
.vstemplate檔案中修改<packages>元素如下所示:<packages repository="extension" repositoryId="MyTemplateContainerExtensionId"> <!-- ... --> </packages>屬性
repository指定存放庫的類型,而repositoryId則是 VSIX 本身的唯一識別碼(這是延伸模組檔案ID中屬性vsixmanifest的值,請參閱 VSIX 延伸模組架構 2.0 參考)。將您的
nupkg檔案放在 VSIX 中稱為Packages的資料夾中。新增必要的封裝檔案至您的
<Asset>vsixmanifest檔案中(請參閱VSIX 延伸模組架構 2.0 參考):<Asset Type="Moq.4.0.10827.nupkg" d:Source="File" Path="Packages\Moq.4.0.10827.nupkg" d:VsixSubPath="Packages" />請注意,您可以在與專案範本相同的 VSIX 中傳遞套件,或者如果這對您的案例更有意義,您可以將它們放在個別的 VSIX 中。 不過,請勿參考您無法控制的任何 VSIX,因為對該延伸模組的變更可能會中斷您的範本。
範本套件存放庫
如果您只散發單一專案/料件範本,且不需要將多個範本封裝在一起,則可以使用更簡單但更有限的方法,將套件直接包含在專案/料件範本 ZIP 檔案中:
請將
<packages>元素在.vstemplate檔案中修改如下所示:<packages repository="template"> <!-- ... --> </packages>repository屬性具有值template,且repositoryId屬性不是必需的。將套件放在專案/項目範本 ZIP 檔案的根資料夾中。
請注意,在包含多個範本的 VSIX 中使用此方法,當一或多個套件與範本通用時,會導致不必要的膨脹。 在這種情況下,請使用 VSIX 作為存放庫, 如上一節所述。
註冊表指定的資料夾路徑
使用 MSI 安裝的 SDK 可以直接在開發人員的計算機上安裝 NuGet 套件。 這可讓您在使用專案或項目範本時立即使用它們,而不必在此期間擷取它們。 ASP.NET 模板使用這種方法。
讓 MSI 將套件安裝到電腦。 您可以只安裝檔案
.nupkg,也可以將這些檔案與展開的內容一起安裝,這會在使用範本時節省額外的步驟。 在此情況下,請遵循 NuGet 的標準資料夾結構,其中.nupkg檔案位於根資料夾中,然後每個套件都有一個子資料夾,其中標識碼/版本組作為子資料夾名稱。撰寫登錄機碼以識別套件位置:
- 關鍵位置:全域
HKEY_LOCAL_MACHINE\SOFTWARE[\Wow6432Node]\NuGet\Repository或,如果是用戶安裝的範本和套件,也可以使用HKEY_CURRENT_USER\SOFTWARE\NuGet\Repository - 金鑰名稱:使用您專屬的名稱。 例如,VS 2012 的 ASP.NET MVC 4 範本會使用
AspNetMvc4VS11。 - 值:套件資料夾的完整路徑。
- 關鍵位置:全域
在檔案中的
<packages>元素.vstemplate中,新增屬性repository="registry",並在屬性中keyName指定登錄機碼名稱。如果您已預先解壓縮套件,請使用 屬性
isPreunzipped="true"。(NuGet 3.2+) 如果您想要在套件安裝結束時強制設計階段建置,請新增屬性
forceDesignTimeBuild="true"。作為最佳化,請新增
skipAssemblyReferences="true",因為範本本身已包含必要的參考。<packages repository="registry" keyName="AspNetMvc4VS11" isPreunzipped="true"> <package id="EntityFramework" version="5.0.0" skipAssemblyReferences="true" /> <-- ... --> </packages>
最佳做法
在 VSIX 資訊清單中新增 NuGet VSIX 的參考,以宣告 NuGet VSIX 的相依性:
<Reference Id="NuPackToolsVsix.Microsoft.67e54e40-0ae3-42c5-a949-fddf5739e7a5" MinVersion="1.7.30402.9028"> <Name>NuGet Package Manager</Name> <MoreInfoUrl>http://learn.microsoft.com/nuget/</MoreInfoUrl> </Reference> <!-- ... -->要求在建立專案/項目範本時即儲存,方法是將
<PromptForSaveOnCreation>true</PromptForSaveOnCreation>包含在.vstemplate檔案中。範本不包含
packages.config檔案,也不包含安裝 NuGet 套件時會新增的任何參考或內容。