Windowsでのパッケージ管理(scoop)(2021年睦月)

# 初めに
こんにちは、本書をご覧になっていただき、読者のみなさまに感謝します。
更新： 2022年 長月：PROXY環境での設定、神無月：管理者でのインストール
更新： 2024年 霜月：グローバルパッケージ更新の注意点

[シリーズ全体構成](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1#%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90)

## 対象の読者
以下のような方々のお役にたてれば幸いです。

- ソフトウェア開発、特に製造や評価などに関わる人
- Windows用のアプリやツールを宣言的に管理したい人
- Windows用のアプリやツールを複数バージョン入れて使い分けたい人

#　パッケージ管理って何という人への説明

Wikipediaによると、「各種のソフトウェアの導入と削除、そしてソフトウェア同士やライブラリとの依存関係を管理するシステム」となっている。

つまり、様々なアプリケーションを使用するときに、関連するライブラリや設定を含めて自動的にインストールし、アップデートしたり、安全に削除したりできる仕組みのこと。管理システムごとにリポジトリが提供されており、バージョン、依存関係、各種設定などが定義されている。
複数のバージョンを切り替えて使えたり、複数アプリをグループ化しておいてまとめてインストールしたりなどの機能を持っていることが多い。

## 環境の文書化や共有に活躍

GUIでの管理システムだと、説明するのに画像が必要となることが多く、例えば開発環境をチームで統一したい場合など、コマンドラインですべて設定できる方がやりやすいし、文書化したり、スクリプト化して共有するのもやりやすい。Windowsにパッケージ管理システムを入れたい理由は、コマンドライン(CLI)での操作ができることも大きな要素だ。

また、インストールされるアプリに対しても、コマンドラインでのパスが自動的に設定され、WindowsMenuからマウスで選択して、、、としないで、コマンドで起動したり、スクリプト化してバッチ処理したり、、、と使いやすくなる。

## パッケージ管理システムの例
### Linux/BSD/Mac/WindowsなどのOS上
- Redhat系: RPM, Yum, DNF など
- Debian系: dpkg, APT, aptitude, synaptic など
- BSD系: ports など
- MacOS: MacPorts, Fink, Homebrew など
- Windows: Chocolatey, Scoop, Windows Package Manager(winget) など

### 種々の言語上
- Node.js: npm, yarn など
- PHP: composer など
- Python: pip など
- Java: maven など

# Scoopに関して

2020年にMicrosoft社のオープンソースとして「Windows Package Manager[^1](winget[^2])」が登場した。将来的にはこれが本命とは思うが、現在（2021年01月)はPreivewであるため、使いやすいScoopを説明する。

ScoopはWindowsのパッケージ管理システムであり、そのライセンスは「The Unlicense」で、個人利用、商用利用、修整、再配布などが自由にできるPublicDomainとなっている。

Scoopの利点の一つは、管理者権限なしで使うことができ、ユーザごとのインストールや設定が可能であること。デメリットとしては対応パッケージ数で他の管理システム(Chocoleteyなど)に劣ること。

## インストール

### scoop自体のインストール
1) powershell を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/84e63553-7efc-15c7-f6dc-8215dc66c0ee.png)
Windowsキーを押し、「power」などと入力すると、以下のように見つかるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/ce04602c-3c0f-8df9-177b-b9b853eb8097.png)

2) PowerShellにて、以下のように入力

```powershell
set-executionpolicy remotesigned -scope currentuser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/61bce794-7488-22f4-cd08-8098df0fe0e5.png)

<details><summary><b>Administraorでのインストールに失敗する時は</b></summary>

Scoopのインストーラは、セキュリティ上の配慮から、管理者アカウントでのインストールができないように設定してある。どうしてもインストールしたい場合は、以下のコマンドで実行できる。

```powershell
iex "& {$(irm get.scoop.sh)} -RunAsAdmin"
```
参考にしたリンク先：
- [【小ネタ】Windows Server 2022にscoopを入れる](https://shigeo-t.hatenablog.com/entry/2022/06/13/050000)
- https://github.com/ScoopInstaller/Install#for-admin
</details>

<details><summary><b>PROXYのある環境で使用する場合の設定</b></summary>

もし、現在のネットワーク環境がPROXYを利用している場合、上記の「iex」では自動的にシステム設定が使用されてscoop自体のインストールは成功する。
しかし、scoop単独ではPROXYを認識できないため、以下のように設定する。
```powershell
scoop config proxy your-proxy.server:proxy-port
```
上記の「your-proxy.server」と「proxy-port」は、「Windowsの設定」「ネットワークとインターネット」　＞　「プロキシ」を見るとわかるので、アドレスとポートを設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/b415ca3d-bd15-b628-23ef-99963558bc74.png)
</details>

### 使ってみよう
ヘルプの表示

```powershell
scoop help
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/802bbbb5-b5f7-1940-bed6-b0594abc2a32.png)

- 使えるパッケージを見つける

xxxxに使いたいパッケージの文字列の一部を入れることで、存在すれば表示される。無指定でsearchすると、main Bucket にあるすべてのパッケージが表示される。

```powershell
scoop search xxxx
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/11b03941-0ed0-2cf9-c664-5488b79c9172.png)


例として、dd をインストールし、アンインストールしてみよう

```powershell
scoop install dd
scoop list
get-command dd
scoop uninstall dd
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/286fef4a-fad6-d4cd-3a7a-5a4c83f421fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/7ed8bc62-3931-c201-91e3-7616e2f23900.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/c43cdce7-3d9a-9146-bdd5-0e5d76805ed6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/6baa3ebb-3355-906f-7f77-ccf6362381d3.png)


### どんなBucketがあるのかを調べる
Bucketとは、Scoopのリポジトリのこと。

- 公式Bucket一覧

```powershell
scoop bucket known
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/614e4c12-a073-e218-09fc-8ae42752c11e.png)

- その他のバケット

awesome-scoop[^3] や GitHub[^4] に公開されている。

### 役立つBucket(Scoopのリポジトリ)を追加する
- 最初に git のインストールが必要

```powershell
scoop install git
```

- 拡張パッケージ

```powershell
scoop bucket add extras
```

- 複数バージョン選択

```powershell
scoop bucket add versions
```

- 日本語環境

** iyokan-jp: サクラエディタなど

```powershell
scoop bucket add iyokan-jp https://github.com/tetradice/scoop-iyokan-jp
```

** jfut: firefox, thunderbird など

```powershell
scoop bucket add jfut https://github.com/jfut/scoop-jfut.git
```

- 追加されているBucketの表示

```powershell
scoop bucket list
```
# 終りに
次はUTF-8に対応し、マルチプラットフォームで動作するPowerShellCoreの話。

# 補足： トラブル治療室
## "pwsh" is still running (2022-07-14)
パッケージの更新時に発生するエラー。
更新は、ユーザパッケージ、グローバルパッケージに応じて、以下のコマンドで実行できる。更新中にエラーが発生するとそこで中断となる。
- scoop update *
- sudo scoop update --global *

### 前提
- 発生条件：PowerShellCore導入後、パッケージ更新が存在する場合
### 現象
以下のようなエラーが表示される。
```cmd
ERROR Application "pwsh" is still running. Close all instances and try again.
```
### 原因
プロセスを見ても「pwsh」が見当たらず、おかしいな？？？と思っていたら、以下のような理由であった。

[scoopは、実行時に pwsh(PowerShellCore) を使用する](https://stackoverflow.com/questions/72282196/update-pwsh-with-scoop)

### 治療
理由が分かれば対処は簡単で、cmdやWindowsの「ファイル名を指定して実行」からscoopを実行せず、オリジナルの「PowerShell」から実行すればよい。

#### 注意点
sudo で更新する場合、pwshが使われてしまうため、以下の様にsudoでpowershellを起動してから更新するとうまくいきます。

```powershell
PS C:\Users\takeu> sudo powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

usgin profile of c:\opt\bin\.psrc.ps1
PS C:\Users\takeu> scoop update pwsh -g
```

### 結果と予防
自分が使ってるのに「Close all instances」っていわれもなーーー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/37514eef-c689-53ab-d9fb-6eb357864dc4.png)

----------

親記事：[WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1)

[^1]: https://devblogs.microsoft.com/commandline/windows-package-manager-preview-v0-2-2521/
[^2]: https://github.com/microsoft/winget-cli
[^3]: https://github.com/tapanchandra/awesome-scoop
[^4]: https://rasa.github.io/scoop-directory/by-score