コンピューターシステム株式会社

技術BLOG

Windowsでパッケージ管理したいなら、先ずScoopより始めよ

環境構築 2019/04/12 東京担当

東京本社のうえおかです。

Windowsのパッケージ管理システムであるScoopというツールの紹介記事です。

普段から使っているツールなのですが、いまいち広まってない感があるので、今回はその普及活動をします。

Scoopはいいぞ!

Scoopとは2013年頃から登場し始めたコマンドラインツールで
Windowsにインストールしたいものをコマンドでインストールしたり、
更新、削除、また、バージョンの切替えなどができるパッケージ管理ツールです。
macOSのHomebrewなどから影響を受けて開発されています。
ライセンスはUnlicenseのため、個人利用はもとより、商用、修整、再配布が可能です。

Scoopとよく比較されるツールでChocoleteyというのもありますが、
Scoopの利点としては、管理者権限での実行が不要なことが一番大きいと思います。
その他も、個人でインストール方法をカスタマイズできたり、
GitHubさえ接続できれば使用可能という高い可用性(Chocoleteyの場合は独自のサーバーで運用しているため、たまにメンテナンスに遭遇する)などがあげられます。

逆にScoopのデメリットとしては対応パッケージ数でChocoleteyに劣ることです。
この点に遭遇した場合は、移り気にchocoコマンドを打ち込むか、自身でScoopのインストール定義ファイルを作成して力技で対応するかになりますが、
最初は前者でいいと思います。
もっとも、普通にインストーラーを使用する方法でも可です。

Scoopのインストール方法

以下の公式ページの案内通りにコマンドを実行します。
https://scoop.sh/

もちろん、管理者権限での実行は不要です。
※以下、PowerShellコンソールで全て実行してください。
※上記のページに書いてある通り、実行にはPowerShell 3以上と.NET Framework 4.5以上が必要です。
 上記未満の環境でインストールを試みた場合、バージョンアップするために必要な
 WMIのダウンロードURLがコンソールに表示されるため、この記事では割愛します。

Set-ExecutionPolicy RemoteSigned -scope CurrentUser; iex (new-object net.webclient).downloadstring('https://get.scoop.sh')

上記のスクリプトを実行すると、ユーザのホームディレクトリ配下にscoopというディレクトリが作成され、
ユーザの環境変数でscoopにPathが通っていることが確認できるかと思います。

scoop -v
#=> Current Scoop version:
#=> c50706a6 (HEAD -> master, origin/master, origin/HEAD) buffalo: Update to version 0.13.7

Scoopの使い方(例:Goのインストール)

と、その前にちょっとScoopの用語について。

実は、Scoopは放送用語の特ダネ、という意味から来ているのではなく、
英語でスコップを表すscoopから来ています。(スコップ(schop)はオランダ語)

それで、scoopコマンドがどうやってインストールするかを定義しているファイルをApp Manifest、
それらをまとめたものをBucket(バケツ)といいます。

つまり、バケツに入っているアプリをスコップで取り出すように、利用できることがScoopの由来となっています。
※この由来に関して、かなり自信ありげに書いてますが100%著者の推測です。

それでは、試しにインストールしてみます

Scoopは内部でgitを使っているので、最初にこちらをインストールしておきます。

scoop install git

複数インストールする場合は、他のパッケージ管理と一緒で可変長に指定できます。
今回は当社ブログの第1回目に投稿されたGo言語をインストールしてみます。
※実際に上記の記事でインストールされた方、なんかすみません!!

# (1) Goを検索
scoop search go
#=>'main' bucket:
#=>    forego (20180217041714)
#=>    go (1.11.2)
#=>    gof (0.0.1)
#=>    ...

# (2) Goをインストール
scoop install go
#=>Installing 'go' (1.11.2) [64bit]
#=>go1.11.2.windows-amd64.zip (128.2 MB) #=>[=============================================] 100%
#=>Checking hash of go1.11.2.windows-amd64.zip ... ok.
#=>Extracting go1.11.2.windows-amd64.zip ... done.
#=>Running installer script...
#=>Linking ~\scoop\apps\go\current => ~\scoop\apps\go\1.11.2
#=>Creating shim for 'go'.
#=>Creating shim for 'gofmt'.
#=>Creating shim for 'godoc'.
#=>'go' (1.11.2) was installed successfully!
#=>Notes
#=>-----
#=>Your GOROOT has been set to: C:\Users\ts-jun.ueoka\scoop\apps\go\current
#=>You can run 'go env GOROOT' to view this at any time.
#=>"$env:USERPROFILE\go\bin)" has been added to your PATH.

(1) Goを検索

ローカルにダウンロードされたbukect内の定義ファイルなどから指定されたキーワードが含まれるbucketを検索します。
検索対象となるのは、bukect名(goの場合は定義ファイルがgo.jsonなのでgoとなる)と実行ファイル名(go, gofmt, godoc)となります。
また、ワイルドカードを指定しなくても部分一致で検索されます。
※ 豆知識として、このsearchコマンドに指定するキーワードは大/小文字を区別しない正規表現として解釈されるため、やろうと思えば、以下のような検索が可能です。

scoop search 'fmt$'
#=> 'main' bucket:
#=>     go (1.11.2) --> includes 'gofmt.exe'
#=>     gow (0.8.0) --> includes 'fmt.exe'

(2) Goをインストール

インストールされるものはそのパッケージに一般的に同梱されているコマンドになります。
今回でいうと、go, gofmt, godocなどのコマンドです。

# goにPathが通っていることを確認。
# Linuxでいうwhich, cmdでいうwhereに相当するPowerShellのコマンドレットです。
Get-Command go
#=>CommandType     Name                                               Version    #=>Source
#=>-------------------        -------                                               ---------     #=>---------
#=>ExternalScript  go.ps1                                                                   #=>C:\Users\ts-jun.ueoka\scoop\shims\go.ps1

# 必要に応じて環境変数も作成されます。
$env:GOROOT
#=>C:\Users\xxxxxx\scoop\apps\go\current

# 試しに実行。
@'
package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}
'@ | Out-File -Encoding UTF8 main.go; go run main.go
#=> Hello, 世界

Scoopの使い方(例:GoをVS Codeで書く)

これまで、Goをターミナル経由で実行していましたが、Visual Studio Codeなどのエディタ・IDEで使いたい場合であっても、Scoopでインストールすることができます。

# 標準のScoopで登録済みのbucket一覧を表示
scoop bucket known
#=> extras
#=> versions
#=> ...

# extrasで管理されているアプリ(主にGUI用)をインストールできるように追加
scoop bucket add extras

# extrasが追加されたか確認
scoop bucket list
#=> extras

# vscodeを検索
scoop search vscode
#=> 'extras' bucket:
#=>     vscode-insiders-portable (nightly)
#=>     vscode-insiders (nightly)
#=>     vscode-portable (1.29.1)
#=>     vscode (1.29.1)

# vscodeをインストール
scoop install vscode
code --install-extension ms-vscode.Go
#=> Found 'ms-vscode.Go' in the marketplace.
#=> Installing...
#=> Extension 'ms-vscode.Go' v0.7.0 was successfully installed!

# Goの開発時に必要となるパッケージを追加
go get -u -v `
  github.com/ramya-rao-a/go-outline `
  github.com/acroca/go-symbols `
  github.com/mdempsky/gocode `
  github.com/rogpeppe/godef `
  golang.org/x/tools/cmd/godoc `
  github.com/zmb3/gogetdoc `
  golang.org/x/lint/golint `
  github.com/fatih/gomodifytags `
  golang.org/x/tools/cmd/gorename `
  sourcegraph.com/sqs/goreturns `
  golang.org/x/tools/cmd/goimports `
  github.com/cweill/gotests/... `
  golang.org/x/tools/cmd/guru `
  github.com/josharian/impl `
  github.com/haya14busa/goplay/cmd/goplay `
  github.com/uudashr/gopkgs/cmd/gopkgs `
  github.com/davidrjenni/reftools/cmd/fillstruct `
  github.com/alecthomas/gometalinter `
  github.com/derekparker/delve/cmd/dlv

gometalinter --install

# Visual Studio Codeを開く
code .

# 以降、前回作成したmain.goを開き「F5」でデバッグ実行が可能。

# main.go ファイルを開く
# func main() {
#   var x, y = 23, 42
#   fmt.Println(x + y)
# }

Scoopの使い方(その他)

しばらくScoopを使っていると、バージョン更新やその更新状況の確認などが必要となってきますので、
以下、よく使用するコマンドを紹介しておきます。

# Scoop自身とローカル内にあるアプリの更新情報を更新
scoop update

# 最新バージョンでないアプリがあるかをチェック
scoop status

# goを更新
scoop update go

# すべてのアプリを更新
scoop update *

# goをアンインストール
scoop uninstall go

おわりに

今回はScoopの紹介ということでScoopをインストールし、Goの環境構築を行ってみました。
本当はこの内容では不十分で、例えば、バージョン管理(最新以外のバージョンを取りたい、Pathに通ってあるバージョンを切替えたい、など)や高速ダウンロード機能(aria2)など、まだまだ紹介しきれていない点が多いです。

詳しくは、公式マニュアルもあるので、(英語ですが)だいたいの使い方は理解できるかと思います。

以上、まだまだ進化途中なツールなのでぜひ普段使いのツールとしてお試しください。