📘

Scoopを調べてみる

2022/10/31に公開

久しぶりに windows に触れている

  • いちエンジニアとして、いろんなアプリケーションを入れたい気持ちと、windows をなるべく汚したくない気持ちとがぶつかり合っている
    • Cドライブ(システムドライブ)を汚したくない、というのは同様の気持ちの人は多いのではないだろうか
      • 環境変数の増加
      • レジストリの増加
      • Program Files の増加
      • ... こういうのが嫌だという気持ちですね。現実的に、OSを入れなおすと入れたアプリケーションが全部飛ぶのはつらいよってのもある

Scoop

  • windows で動くパッケージマネージャである Scoop は私の不満をある程度解消してくれそうである
- Eliminates permission popup windows
- Hides GUI wizard-style installers
- Prevents PATH pollution from installing lots of programs
- Avoids unexpected side-effects from installing and uninstalling programs
- Finds and installs dependencies automatically
- Performs all the extra setup steps itself to get a working program
  • 簡単に意訳すると
    • 権限確認のダイアログが出ない
    • GUIのインストールダイアログが出ない
    • アプリを入れることによって、環境変数PATHを汚さない
    • アプリのインストールやアンインストールによる影響を他アプリに与えない
    • 依存関係を加味してアプリをインストールできる
    • 後から拡張できるよ

導入

ドキュメントにしたがって調査する

  • powershell にて
iwr -useb get.scoop.sh | iex
  • ふむ。powershell など使わないので、はっきりいってコマンドの意味がわからなかった。それぞれ調べたものが以下だ
    • iwrcurlwget みたいなもので、Invoke-WebRequest というコマンドの略称である
      • -useb はおそらく -UseBasicParsing の略称なのだが、ドキュメントには PowerShell 6.0.0 以降では非推奨 と書いてある
    • iexInvoke-Expression で、受け取った文字列をコマンドとして実行するというもの
  • つまり、web から取ってきたシェルの内容を実行する。というコマンドがこれなわけだ
  • ところで、get.scoop.sh が謎なわけだけど、これはブラウザでアクセスすると install.ps1 が返ってくる。どこで紐づけているのか。

powershell バージョンを確認

  • 私の環境の powershell は、windows をインストールしてからノータッチである。ちなみに windows 11 である
  • バージョンを見てみよう
PS C:\Users\J2> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22000.832
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22000.832
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
  • 先ほどまで調査していたドキュメントは powershell-7.2 のものなので、まずは powershell versionを上げるのが良いかな

powershell バージョン更新を考える

個別のインストール パスと実行可能ファイル名
PowerShell 7 は新しいディレクトリにインストールされ、Windows PowerShell 5.1 とのサイド バイ サイド実行が可能になります。

バージョン別のインストール場所:

Windows PowerShell 5.1: $env:WINDIR\System32\WindowsPowerShell\v1.0
PowerShell 6.x: $env:ProgramFiles\PowerShell\6
PowerShell 7: $env:ProgramFiles\PowerShell\7
新しい場所が PATH に追加され、Windows PowerShell 5.1 と PowerShell 7 の両方を実行できるようになります。 Powershell 6.x から PowerShell 7 に移行する場合は、PowerShell 6 が削除され、PATH が置き換えられます。

Windows PowerShell では、PowerShell の実行可能ファイルには powershell.exe という名前が付けられます。 バージョン 6 以降では、実行可能ファイルには pwsh.exe という名前が付けられます。 新しい名前を使用すると、両方のバージョンのサイド バイ サイド実行をサポートしやすくなります。

引用元

結論としては、私は powershell-7.2 を入れない

  • いまのところ powershell をそこまで使う予定がない
  • 5.1 と 7系とで別扱いなので、入れるほうが混乱の元となる懸念
  • Scoop を導入するにあたっては 5.1 で問題ないし、7.2 を導入するのは大げさと考えた

あらためて導入を進める

  • powershell にて
iwr -useb get.scoop.sh | iex
  • 1発目の実行結果は以下のエラーであった
PowerShell requires an execution policy in [Unrestricted, RemoteSigned, ByPass] to run Scoop. For example, to set the execution policy to 'RemoteSigned' please run 'Set-ExecutionPolicy RemoteSigned -Scope CurrentUser'.
Abort.
  • 指示に従って進める
PS C:\Users\J2> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
  • 無事権限設定が済んだので、あらためて
PS C:\Users\J2> iwr -useb get.scoop.sh | iex
Initializing...
Downloading...
Extracting...
Creating shim...
Adding ~\scoop\shims to your path.
Scoop was installed successfully!
Type 'scoop help' for instructions.
  • 30sec ほどでインストールが完了した
PS C:\Users\J2> scoop
Usage: scoop <command> [<args>]

Available commands are listed below.

Type 'scoop help <command>' to get more help for a specific command.

Command    Summary
-------    -------
alias      Manage scoop aliases
bucket     Manage Scoop buckets
cache      Show or clear the download cache
cat        Show content of specified manifest. If available, `bat` will be used to pretty-print the JSON.
checkup    Check for potential problems
cleanup    Cleanup apps by removing old versions
config     Get or set configuration values
create     Create a custom app manifest
depends    List dependencies for an app, in the order they'll be installed
download   Download apps in the cache folder and verify hashes
export     Exports installed apps, buckets (and optionally configs) in JSON format
help       Show help for a command
hold       Hold an app to disable updates
home       Opens the app homepage
import     Imports apps, buckets and configs from a Scoopfile in JSON format
info       Display information about an app
install    Install apps
list       List installed apps
prefix     Returns the path to the specified app
reset      Reset an app to resolve conflicts
search     Search available apps
shim       Manipulate Scoop shims
status     Show status and check for new app versions
unhold     Unhold an app to enable updates
uninstall  Uninstall an app
update     Update apps, or Scoop itself
virustotal Look for app's hash or url on virustotal.com
which      Locate a shim/executable (similar to 'which' on Linux)

導入後のチェック

  • このマシンには git が未導入なので入れてみることにする
    • 現時点での最新の git 2.38.1 がインストールできるようである
PS C:\Users\J2> scoop search git
Results from local buckets...

Name                        Version          Source Binaries
----                        -------          ------ --------
biodiff                     1.0.3            main   git-biodiff.exe
git-annex                   10.20220928      main
git-branchless              0.5.1            main
git-bug                     0.7.2            main
git-chglog                  0.15.1           main
git-crypt                   0.6.0-701fb8e    main
git-filter-repo             2.38.0           main
git-interactive-rebase-tool 2.2.1            main
git-istage                  0.3.56           main
git-lfs                     3.2.0            main
git-sizer                   1.5.0            main
git-tfs                     0.32.0           main
git-town                    7.8.0            main
git-up                      2.1.0            main
git-with-openssh            2.38.1.windows.1 main
git-xargs                   0.1.1            main
git                         2.38.1.windows.1 main
gitea                       1.17.3           main
gitignore                   0.2018.07.25     main
gitkube                     0.3.0            main
gitlab-runner               15.3.2           main
gitleaks                    8.15.0           main
gitomatic                   0.2              main
gitsign                     0.3.2            main
gitui                       0.21.0           main
gitversion                  5.10.2           main
legit                       1.2.0            main
mingit-busybox              2.38.1.windows.1 main
mingit                      2.38.1.windows.1 main
psgithub                    0.15.240         main
psutils                     0.2020.02.27     main   gitignore.ps1


PS C:\Users\J2> scoop install git git-lfs
Installing '7zip' (22.01) [64bit] from main bucket
7z2201-x64.msi (1.8 MB) [==========================================================================================================================================================================================================] 100%
Checking hash of 7z2201-x64.msi ... ok.
Extracting 7z2201-x64.msi ... done.
Linking ~\scoop\apps\7zip\current => ~\scoop\apps\7zip\22.01
Creating shim for '7z'.
Creating shim for '7zFM'.
Creating shim for '7zG'.
Creating shortcut for 7-Zip (7zFM.exe)
Persisting Codecs
Persisting Formats
Running post_install script...
'7zip' (22.01) was installed successfully!
Notes
-----
Add 7-Zip as a context menu option by running: "C:\Users\J2\scoop\apps\7zip\current\install-context.reg"
Installing 'git' (2.38.1.windows.1) [64bit] from main bucket
PortableGit-2.38.1-64-bit.7z.exe (46.4 MB) [=======================================================================================================================================================================================] 100%
Checking hash of PortableGit-2.38.1-64-bit.7z.exe ... ok.
Extracting dl.7z ... done.
Linking ~\scoop\apps\git\current => ~\scoop\apps\git\2.38.1.windows.1
Creating shim for 'sh'.
Creating shim for 'bash'.
Creating shim for 'git'.
Creating shim for 'gitk'.
Creating shim for 'git-gui'.
Creating shim for 'scalar'.
Creating shim for 'tig'.
Creating shim for 'git-bash'.
Creating shortcut for Git Bash (git-bash.exe)
Creating shortcut for Git GUI (git-gui.exe)
'git' (2.38.1.windows.1) was installed successfully!
Notes
-----
Set Git Credential Manager Core by running: "git config --global credential.helper manager-core"
Installing 'git-lfs' (3.2.0) [64bit] from main bucket
git-lfs-windows-amd64-v3.2.0.zip (4.1 MB) [========================================================================================================================================================================================] 100%
Checking hash of git-lfs-windows-amd64-v3.2.0.zip ... ok.
Extracting git-lfs-windows-amd64-v3.2.0.zip ... done.
Linking ~\scoop\apps\git-lfs\current => ~\scoop\apps\git-lfs\3.2.0
Creating shim for 'git-lfs'.
'git-lfs' (3.2.0) was installed successfully!
  • 環境変数
    • ユーザ環境変数 PATHC:\Users\{$USERNAME}\scoop\shims という値が追加されている
      • Scoop でアプリケーションをインストールすると、このディレクトリに symlink 的なものが追加されていくという流れのようだ
    • ユーザ環境変数にもう1つ GIT_INSTALL_ROOT なる変数が増えている
      • windows 版の git だから追加されたものなのか判断がつかない
  • レジストリ
    • 確認したが、余計な値の追加は見られなかった。良い
    • 残念ながら、レジストリの操作はアプリケーションによって様々のようだ
      • Scoop のリポジトリ を検索すると出てくるので雰囲気はこちらを見ると理解しやすいだろう
  • インストールしたアプリケーションの本体はどこか
    • scoop の下の apps に実態があり、また複数のバージョンに対して current の symlink が貼られているようだった
PS C:\Users\J2\scoop> ls apps

    ディレクトリ: C:\Users\J2\scoop\apps

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2022/10/31     18:17                7zip
d-----        2022/10/31     18:17                git
d-----        2022/10/31     18:17                git-lfs
d-----        2022/10/31     18:07                scoop


PS C:\Users\J2\scoop> ls apps/git

    ディレクトリ: C:\Users\J2\scoop\apps\git

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2022/10/31     18:17                2.38.1.windows.1
d-r--l        2022/10/31     18:17                current
  • info コマンドを使ってみると、先ほど追加された GIT_INSTALL_ROOT なる変数が見られた
PS C:\Users\J2\scoop> scoop info git


Name        : git
Description : Distributed version control system
Version     : 2.38.1.windows.1
Bucket      : main
Website     : https://gitforwindows.org
License     : GPL-2.0-only
Updated at  : 2022/10/31 1:30:58
Updated by  : J2
Installed   : 2.38.1.windows.1
Binaries    : bin\sh.exe | bin\bash.exe | cmd\git.exe | cmd\gitk.exe | cmd\git-gui.exe | cmd\scalar.exe | usr\bin\tig.exe | git-bash.exe
Shortcuts   : Git Bash | Git GUI
Environment : GIT_INSTALL_ROOT = <root>
Notes       : Set Git Credential Manager Core by running: "git config --global credential.helper manager-core"
  • git-lfs については、Environment ブロック が存在していない
PS C:\Users\J2\scoop> scoop info git-lfs


Name        : git-lfs
Description : Git extension for versioning large files.
Version     : 3.2.0
Bucket      : main
Website     : https://git-lfs.github.com
License     : MIT
Updated at  : 2022/10/31 1:30:58
Updated by  : J2
Installed   : 3.2.0
Binaries    : git-lfs.exe
Suggestions : git | git-with-openssh

まとめ

  • Scoop でコマンドライン操作でアプリ管理が可能であり、わずらわしいGUI操作は不要である
  • 環境変数はPATHは最小限にとどまるが、その他の変数もインストールするアプリによっては定義される
  • レジストリはインストールするアプリによっては登録される
    • アンインストール時には削除される
  • 上記を踏まえると、OS再インストールすると動作の保証はあやしいが、アプリの導入手順を残しておくことで環境構築は容易にはなるだろう

Discussion