建立 UWP 套件

Universal Windows Platform (UWP) 為所有執行 Windows 10 的裝置提供共用的應用程式平台。 在此模型中,UWP 應用程式可以呼叫所有裝置共用的 WinRT API,也能呼叫特定於應用程式執行裝置家族的 API(包括 Win32 和 .NET)。

在這個教學中,你會建立一個包含原生 UWP 元件(包含 XAML 控制項)的 NuGet 套件,該套件可用於受管型與原生專案。

先決條件

  1. Visual Studio 2017 或 Visual Studio 2015。 可從 visualstudio.com 免費安裝2017年社群版;你也可以使用專業版和企業版。

  2. NuGet CLI。 下載最新版本的 nuget.exe,從 nuget.org/downloads,並將其儲存到你選擇的位置(這會直接下載 .exe)。 如果還沒加入,請將該位置加入到你的 PATH 環境變數中。

建立 UWP Windows Runtime 元件

  1. 在Visual Studio中,選擇 File > 新 > Project,展開 Visual C++ > Windows > Universal 節點,選擇 Windows Runtime Component (Universal Windows) 模板,將名稱改為 ImageEnhancer,然後點擊確定。 當提示時,接受目標版本和最低版本的預設值。

    建立新的 UWP Windows Runtime 元件專案

  2. 在 Solution Explorer 中右鍵點擊專案,選擇 Add > 新項目,點選 Visual C++ > XAML節點,選擇 Templated Control,將名稱改為 AwesomeImageControl.cpp,然後點選 Add:

    新增一個新的 XAML 模板控制項到專案中

  3. 在Solution Explorer中右鍵點擊專案,選擇 Properties. 在屬性頁面中,展開 Configuration Properties> C/C++,點選 Output Files。 在右側的窗格中,將 產生 XML 文件 檔案的值改為「是」:

    將產生 XML 文件檔案設定為「是」

  4. 現在右鍵點擊 解決方案 ,選擇 批次建置,然後如下方所示勾選對話框中的三個除錯方塊。 這樣可以確保當你編譯時,能為 Windows 支援的每個目標系統產生完整的產物組合。

    批次建置

  5. 在批次建置對話框中,點選 建置 以驗證專案並建立你需要的輸出檔案,供 NuGet 套件使用。

備註

在這個教學中,你會使用套件的除錯產物。 對於非除錯套件,請在批次建置對話框中查看發佈選項,並在後續步驟中參考結果的發佈資料夾。

建立並更新 .nuspec 檔案

要建立初始 .nuspec 檔案,請依照以下三個步驟操作。 接下來的章節會引導你了解其他必要的更新。

  1. 打開命令提示字元,然後移至包含 ImageEnhancer.vcxproj 的資料夾(這個資料夾位於方案檔案之下的子資料夾中)。

  2. 執行 NuGet spec 指令來產生 ImageEnhancer.nuspec (檔案名稱取自檔案名稱 .vcxproj ):

    nuget spec
    
  3. 在編輯器中開啟 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 套件總管 這類工具中打開這個檔案並展開所有節點,你會看到以下內容:

NuGet 套件總管顯示 ImageEnhancer 套件

小提示

.nupkg檔案其實就是副檔名不同的 ZIP 檔。 你也可以查看套件內容,然後在.nupkg與.zip之間切換,但記得在上傳套件到 nuget.org 前先還原檔案擴充名。

要讓你的套件提供給其他開發者,請依照 「發佈套件」的指示操作。