﻿# 介紹好用工具：Win 10 內建的 PackageManagement 套件管理器 (OneGet)

[OneGet](http://oneget.org/) 是微軟新一代 Windows 套件管理器 ( 類似 Ubuntu Linux 底下的 apt-get 工具 )，這名字還蠻漂亮的，不過前陣子卻把名稱改為 PackageManagement，但無論如何，我覺得 OneGet 比較好聽，你只要知道這兩個是一樣的東西就好了。 目前這套工具已經內建於 Windows 10 作業系統中，透過 PowerShell 的 Cmdlet 就可以呼叫使用，這個鮮為人知的全新工具試圖解決未來所有軟體安裝的問題，本篇文章將詳細介紹 OneGet 的基本概念與使用方式。

### OneGet 簡介

在 Linux 的世界，老早就有許多套件管理器，例如說 Ubuntu 的 apt-get、RedHat 的 rpm、或是 Fedora 的 yum 等等。但是在 Windows 平台，卻少有統一的安裝管理機制，你一定看過、用過 \*.msi、\*.msu 安裝檔，也可能看過 \*.appx 安裝檔 (Windows Apps)，還有許多其他類似的安裝工具，而 IT 人員若要自動化整合各種不同的軟體安裝，將會遇到極大挑戰，而 OneGet (PackageManagement) 的出現，就是為了解決這個問題而生。

### 了解 OneGet 架構

嚴格說起來，這套 OneGet 工具並不能說是「套件管理器」，應該說他是「套件管理器的管理器」( Package Management Aggregator ) 則更為洽當。 他提供一套統一的 PowerShell 操作介面，讓使用者可以不用知道安裝過程中背後的安裝技術或套件的取得來源，只要知道套件名稱，就可以輕輕鬆鬆地將軟體安裝起來。而 OneGet 也提供一組 APIs 可撰寫 **套件提供者** (Package Provider) 外掛，並且可讓使用者指定不同的 **套件來源** (package sources) 供 **套件提供者** 取得所需的安裝檔案。

你可以看看以下這個架構圖，基本上你可以把 OneGet 看成四個不同的元件，**End User** 只需要知道 PowerShell 的 cmdlets 怎麼用，這些 cmdlets 的內部會透過 **PackageManagement Core** 核心元件的 API 存取 **PackageManagement Providers** (套件提供者)，而 **PackageManagement Providers** (套件提供者) 會讀取不同的 **Package Sources** (套件來源) 將套件下載回來，並且透過 **PackageManagement Providers** 進行安裝作業。

[![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/84529ceb0a13f7c3cd25-image_thumb_216.png)](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/645461df681a200f2847-image_2852.png)

簡單來說，Package Management 的架構包含三種元件：

-   PackageManagement 核心元件 (Core component)
-   一個 PowerShell 模組 (module) 用來提供各式 cmdlets 命令
-   一組內建的套件提供者 ( 隨時可以新增提供者 )

預設內建的套件提供者有：

-   **Bootstrap** provider (用來自動尋找其他可能的提供者)
-   **MSI** provider (用來處理所有的 MSI 安裝檔)
-   **MSU** provider (用來處理所有的 MSU 更新檔)
-   **Programs** provider (用來處裡 **控制台** 的 **程式和功能** (**新增/移除程式**) 中已經註冊進系統的程式和功能)
-   **PowerShellGet** provider (用來處裡不同的 PowerShell 模組安裝作業)

### 快速上手 OneGet 與相關指令操作

如果是一台全新安裝的 Windows 10 電腦，在開啟 Windows PowerShell 之後，就可以輸入相關命令。如果你用的是 Windows 8.1 以前的版本，你必須先下載安裝 [Windows Management Framework 5.0 Production Preview](https://www.microsoft.com/en-us/download/details.aspx?id=54616) 才能使用。

從以下圖示你可以看出，我們用 Get-PackageProvider 與 Get-PackageSource 查出系統中已經內建的 PackageProvider 與 PackageSource 有哪些，如果你輸入 Get-Package 會看不到任何已經安裝的套件，因為我們還沒用 OneGet 安裝過任何套件。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0a5a6d6b21cde38d4d88-image_2853.png)

如果你想知道有多少可用的 cmdlets 命令，可以輸入以下命令進行查詢：

> **Get-Command -Module PackageManagement | sort noun, verb**

從查詢出來的結果可以發現，其實 OneGet 很容易上手，也才 3 組命令，分別用來控制 **Package**、**Package Provider** 與 **Package Source** 而已。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f46605050a7ddf45d0bf-image_2854.png)

找出目前已知的所有 Package Provider 可以輸入以下命令：

> **Find-PackageProvider**

然而第一次執行時，他會提示你要不要安裝 NuGet provider

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c8ffea862f1daff49726-image_2855.png)

由於 Provider 很多，我們除了 [NuGet](http://nuget.org/) provider 安裝好了之外，也建議大家可以安裝 [Chocolatey](https://chocolatey.org/) provider，這裡有非常大量的軟體已經註冊在這邊，對日後安裝常用工具軟體非常的方便。

**請注意**：若要安裝 **Package**、**Package Provider** 或 **Package Source**，都需要**以系統管理員身分執行** PowerShell，否則會遇到權限不足的錯誤訊息。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/73bb847db674673ec04d-image_2856.png)

**請注意**：當你安裝完 **chocolatey provider** 之後，記得要**重開 PowerShell** 否則你會看不到已經安裝的 **Package Provider** 喔！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/06cb790d42da0668703d-image_2857.png)

重開 PowerShell 之後，就可以查詢到了：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f0e229f41606ba7d4a15-image_2858.png)

安裝好了必要的 Package Provider 之後，還不能立刻安裝軟體，你還必須先註冊 **套件來源** (**Package Source**) 才行，否則你將會找不到可以下載的安裝檔。

> **Register-PackageSource -Name chocolatey -Location http://chocolatey.org/api/v2/ -ProviderName Chocolatey -Trusted -Force**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/92309a8de6a0c9c7b462-image_2859.png)

最後建議修改一下 PowerShell 的 **執行原則** (ExecutionPolicy)，將預設值改為 **RemoteSigned** 即可。

> **Set-ExecutionPolicy RemoteSigned -Force**

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/62ac504e58fb99b3f4d5-image_2860.png)

接下來就可以開始來安裝軟體了！

我們以 [Notepad2](http://www.flos-freeware.ch/notepad2.html) 編輯器軟體為例，要安裝之前，我們可以先用 **Find-Package -Name Notepad2** 來查詢是否有這個套件，如果有，就可以直接以 **Install-Package -Name Notepad2** 進行安裝：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6763cdcd53242209ca03-image_2861.png)

安裝好之後，我們可以用 **Get-Package** 取得目前已經安裝過的所有軟體 (所有套件提供者)，也可以針對不同的 **套件提供者** (**PackageSource**) 列出已經安裝的軟體。

如下圖示有三行指令：

-   第一行是取得所有套件提供者。
-   第二行則是取得所有透過 **Programs** 提供者安裝的應用程式 (包含不是透過 OneGet 安裝的程式)，其中加上 **\-IncludeWindowsInstaller** 則是代表列出所有透過 MSI 安裝檔安裝的應用程式。
-   第三行則是僅列出透過 **Chocolatey** 提供者安裝的應用程式。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/09ad82635756ad48f7d0-image_2862.png)

由於 OneGet 內建就提供了 **PowerShellGet** 套件提供者，這個套件提供者會提供 [PowerShell Gallery](https://www.powershellgallery.com/) 網站上所整理的許多 PowerShell 模組與指令 (Cmdlets)，時至今日共用 558 支模組與程式可供安裝，當然這網站只是剛開始營運，相信日後會有更多好用的模組與 Cmdlets 指令可供下載。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/484e28a513d83142338b-image_2863.png)

我們以 [PowerShellCookbook](https://www.powershellgallery.com/packages/PowerShellCookbook) 這個套件為例，這是 [Windows PowerShell Cookbook](http://www.powershellcookbook.com/) 這本書所有提到的命令集，如果你想安裝這個模組的話，可以輸入以下指令安裝：

> **Install-Module -Name PowerShellCookbook**

而且安裝完成後，就可以立刻執行 [PowerShellCookbook](https://www.powershellgallery.com/packages/PowerShellCookbook) 模組所提供的 Cmdlets 命令：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/90310af7bedd290e397e-image_2864.png)

透過 **Get-Module** 命令也可以查出 PowerShellCookbook 模組確實也已經安裝成功：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c1cdde3073b56941b908-image_2865.png "image")

基本上從 PowerShell Gallery 下載回來的模組 ([Modules](https://www.powershellgallery.com/packages)) 都會安裝到以下路徑：

> **C:\\Program Files\\WindowsPowerShell\\Modules**

而所有的工具腳本 ([Scripts](https://www.powershellgallery.com/packages?F=Scripts)) 都會被安裝到以下路徑：

> **C:\\Program Files\\WindowsPowerShell\\Scripts**

### 總結

PackageManagement 套件管理器 (OneGet) 目前應該還算在發展階段，並且開放原始碼 ( [https://github.com/oneget/oneget](https://github.com/oneget/oneget "https://github.com/oneget/oneget") )，相信日後會有更多套件提供者出現。這工具對許多 IT 從業人員來說，透過指令列的方式進行安裝軟體，將可大幅簡化企業內部大量軟體部署的複雜度，待 PackageManagement 套件管理器的生態日趨成熟，有許多以前不容易自動化的安裝部署流程，都將變得更加簡單易用，也更容易自行擴充原本做不到的功能。

**相關連結**

-   [PackageManagement (aka OneGet)](http://oneget.org/)

-   [OneGet 文件庫 (Wiki)](https://github.com/OneGet/oneget/wiki)
-   [OneGet in action](https://github.com/OneGet/oneget/wiki/cmdlets) ( 關於 OneGet cmdlet 的使用方式 )
-   [OneDrive > PackageManagement](https://onedrive.live.com/?authkey=%21ABehsy6i3rzQdxE&id=EF4B329A5EB9EA4D%21127&cid=EF4B329A5EB9EA4D) (所有線上會議都有錄影並放在這個 OneDrive 雲端磁碟空間裡)
-   [Installation and Servicing MVP Online Meeting - "Repeat MVP Summit Session on PackageManagement"](https://onedrive.live.com/?authkey=%21AEbyMMRE7dmvIIQ&cid=EF4B329A5EB9EA4D&id=EF4B329A5EB9EA4D%21132&parId=root&o=OneUp) (影片)

-   [PowerShell OneGet (@PSOneGet) | Twitter](https://twitter.com/PSOneGet)
-   [Apt-Get for Windows - OneGet and Chocolatey on Windows 10 - Scott Hanselman](http://www.hanselman.com/blog/AptGetForWindowsOneGetAndChocolateyOnWindows10.aspx)
-   [Introducing PackageManagement in Windows 10 - PackageManagement - TechNet Blogs](http://blogs.technet.com/b/packagemanagement/archive/2015/04/29/introducing-packagemanagement-in-windows-10.aspx)
-   [windows 10 - PowerShell PackageManagement, how to uninstall a package provider? - Stack Overflow](http://stackoverflow.com/questions/32508133/powershell-packagemanagement-how-to-uninstall-a-package-provider)
-   [How to Use PackageManagement (aka OneGet) on Windows 10](http://www.howtogeek.com/224111/how-to-use-packagemanagement-aka-oneget-on-windows-10/)
-   [Chocolatey Gallery](https://chocolatey.org/)

-   [OneGet Provider for Chocolatey](https://github.com/chocolatey/chocolatey-oneget) (GitHub)

-   [chocolatey/chocolatey-oneget - Gitter](https://gitter.im/chocolatey/chocolatey-oneget "https://gitter.im/chocolatey/chocolatey-oneget")

-   [PowerShell Gallery | Home](https://www.powershellgallery.com/)
-   [The Will Will Web | 如何修復 PowerShell 無法執行任何 Cmdlet 的問題](/post/2015/12/11/How-do-I-fix-a-broken-Powershell.aspx)
