Universal Windows Platform (UWP) 為所有執行 Windows 10 的裝置提供共用的應用程式平台。 在此模型中,UWP 應用程式可以呼叫所有裝置共用的 WinRT API,也能呼叫特定於應用程式執行裝置家族的 API(包括 Win32 和 .NET)。
在這個教學中,你會建立一個包含原生 UWP 元件(包含 XAML 控制項)的 NuGet 套件,該套件可用於受管型與原生專案。
先決條件
Visual Studio 2017 或 Visual Studio 2015。 可從 visualstudio.com 免費安裝2017年社群版;你也可以使用專業版和企業版。
NuGet CLI。 下載最新版本的
nuget.exe,從 nuget.org/downloads,並將其儲存到你選擇的位置(這會直接下載.exe)。 如果還沒加入,請將該位置加入到你的 PATH 環境變數中。
建立 UWP Windows Runtime 元件
在Visual Studio中,選擇 File > 新 > Project,展開 Visual C++ > Windows > Universal 節點,選擇 Windows Runtime Component (Universal Windows) 模板,將名稱改為 ImageEnhancer,然後點擊確定。 當提示時,接受目標版本和最低版本的預設值。
在 Solution Explorer 中右鍵點擊專案,選擇 Add > 新項目,點選 Visual C++ > XAML節點,選擇 Templated Control,將名稱改為 AwesomeImageControl.cpp,然後點選 Add:
在Solution Explorer中右鍵點擊專案,選擇 Properties. 在屬性頁面中,展開 Configuration Properties> C/C++,點選 Output Files。 在右側的窗格中,將 產生 XML 文件 檔案的值改為「是」:
現在右鍵點擊 解決方案 ,選擇 批次建置,然後如下方所示勾選對話框中的三個除錯方塊。 這樣可以確保當你編譯時,能為 Windows 支援的每個目標系統產生完整的產物組合。
在批次建置對話框中,點選 建置 以驗證專案並建立你需要的輸出檔案,供 NuGet 套件使用。
備註
在這個教學中,你會使用套件的除錯產物。 對於非除錯套件,請在批次建置對話框中查看發佈選項,並在後續步驟中參考結果的發佈資料夾。
建立並更新 .nuspec 檔案
要建立初始 .nuspec 檔案,請依照以下三個步驟操作。 接下來的章節會引導你了解其他必要的更新。
打開命令提示字元,然後移至包含
ImageEnhancer.vcxproj的資料夾(這個資料夾位於方案檔案之下的子資料夾中)。執行 NuGet
spec指令來產生ImageEnhancer.nuspec(檔案名稱取自檔案名稱.vcxproj):nuget spec在編輯器中開啟
ImageEnhancer.nuspec並更新,使其符合以下內容,並將 YOUR_NAME 替換為適當的值。<id>該值必須在 nuget.org 間唯一(詳見「建立套件」中描述的命名慣例)。 另外要注意,你也必須更新作者和描述標籤,否則在打包階段會出錯。<?xml version="1.0"?> <package > <metadata> <id>ImageEnhancer.YOUR_NAME</id> <version>1.0.0</version> <title>ImageEnhancer</title> <authors>YOUR_NAME</authors> <owners>YOUR_NAME</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Awesome Image Enhancer</description> <releaseNotes>First release</releaseNotes> <copyright>Copyright 2016</copyright> <tags>image enhancer imageenhancer</tags> </metadata> </package>
備註
對於為公開使用而設計的套件,請特別注意元素, <tags> 因為這些標籤能幫助他人找到你的套件並了解其功能。
將 Windows 元資料加入套件
Windows Runtime 元件需要描述其所有公開型別的元資料,這使得其他應用程式和函式庫能夠使用該元件。 這些元資料包含在 .winmd 檔案中,該檔案會在你編譯專案時建立,必須包含在你的 NuGet 套件中。 同時也會建立包含 IntelliSense 資料的 XML 檔案,並應包含其中。
將以下 <files> 節點加入檔案中 .nuspec :
<package>
<metadata>
...
</metadata>
<files>
<!-- WinMd and IntelliSense files -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
</files>
</package>
新增 XAML 內容
要在元件中加入 XAML 控制項,你需要加入包含該控制項預設範本的 XAML 檔案(由專案範本產生)。 這也放入 <files> 區段中。
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
</files>
</package>
新增原生實作函式庫
在你的元件中,ImageEnhancer 類型的核心邏輯是原生程式碼,包含在每個目標執行時(ARM、x86 和 x64)產生的各種 ImageEnhancer.dll 組合語言中。 要將這些資料納入套件,請在本 <files> 節中引用它們及其相關的 .pri 資源檔案:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
</files>
</package>
新增 .targets
接著,可能會消耗 NuGet 套件的 C++ 和 JavaScript 專案需要 .targets 檔案來識別必要的組合語言和 winmd 檔案。 (C# 和 Visual Basic 專案會自動完成這件事。)請將以下文字複製到 ImageEnhancer.targets,並儲存在與 .nuspec 檔案相同的資料夾中。
注意:此 .targets 檔案名稱必須與套件 ID(例如 <Id> 檔案中的 .nupspec 元素)相同:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ImageEnhancer-Platform Condition="'$(Platform)' == 'Win32'">x86</ImageEnhancer-Platform>
<ImageEnhancer-Platform Condition="'$(Platform)' != 'Win32'">$(Platform)</ImageEnhancer-Platform>
</PropertyGroup>
<ItemGroup Condition="'$(TargetPlatformIdentifier)' == 'UAP'">
<Reference Include="$(MSBuildThisFileDirectory)..\..\lib\uap10.0\ImageEnhancer.winmd">
<Implementation>ImageEnhancer.dll</Implementation>
</Reference>
<ReferenceCopyLocalPaths Include="$(MSBuildThisFileDirectory)..\..\runtimes\win10-$(ImageEnhancer-Platform)\native\ImageEnhancer.dll" />
</ItemGroup>
</Project>
然後在你的ImageEnhancer.targets檔案中參考.nuspec:
<?xml version="1.0"?>
<package >
<metadata>
...
</metadata>
<files>
...
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
最終 .nuspec
您的最終 .nuspec 檔案現在應該會呈現如下樣貌,YOUR_NAME也應被適當值替換:
<?xml version="1.0"?>
<package >
<metadata>
<id>ImageEnhancer.YOUR_NAME</id>
<version>1.0.0</version>
<title>ImageEnhancer</title>
<authors>YOUR_NAME</authors>
<owners>YOUR_NAME</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Awesome Image Enhancer</description>
<releaseNotes>First Release</releaseNotes>
<copyright>Copyright 2016</copyright>
<tags>image enhancer imageenhancer</tags>
</metadata>
<files>
<!-- WinMd and IntelliSense -->
<file src="..\Debug\ImageEnhancer\ImageEnhancer.winmd" target="lib\uap10.0"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.xml" target="lib\uap10.0"/>
<!-- XAML controls -->
<file src="Themes\Generic.xaml" target="lib\uap10.0\Themes"/>
<!-- DLLs and resources -->
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm\native"/>
<file src="..\ARM\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-arm64\native"/>
<file src="..\ARM64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-arm64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x64\native"/>
<file src="..\x64\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x64\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.dll" target="runtimes\win10-x86\native"/>
<file src="..\Debug\ImageEnhancer\ImageEnhancer.pri" target="runtimes\win10-x86\native"/>
<!-- .targets -->
<file src="ImageEnhancer.targets" target="build\native"/>
</files>
</package>
封裝元件
當已經完成列出所有需要包含在套件中的檔案後,你就可以執行以下 .nuspec 指令:
nuget pack ImageEnhancer.nuspec
這會產生 ImageEnhancer.YOUR_NAME.1.0.0.nupkg。 在像 NuGet 套件總管 這類工具中打開這個檔案並展開所有節點,你會看到以下內容:
小提示
.nupkg檔案其實就是副檔名不同的 ZIP 檔。 你也可以查看套件內容,然後在.nupkg與.zip之間切換,但記得在上傳套件到 nuget.org 前先還原檔案擴充名。
要讓你的套件提供給其他開發者,請依照 「發佈套件」的指示操作。