SyncthingとReadyNASで無理矢理構築したオレオレBucketでScoopを使ったWindowsの開発環境整備

Posted by 雅楽斎 on Sunday, January 12, 2020

TOC

Windows環境での統一した環境構築をサポートしてくれるScoop

Scoop

Windows標準で提供されないコマンドや開発環境のインストールを容易にしてくれるScoopというソフトウェアがあります。そのまま使っても大変便利ですが、もうひと手間、二手間、三手間加えることでパケット通信量を削減します。

ざっくり、普通にScoopを使う場合の動作イメージです。

sequenceDiagram title: 一般的なScoop利用 participant a as PC1 participant b as PC2 participant c as hogeの
配布サーバー
(インターネット上) a->>a: scoop install hoge activate a a->>c: hogeの配布パッケージ取得 c-->>a: hogeのパッケージ a->>a: hogeのインストール deactivate a b->>b: scoop install hoge activate b b->>c: hogeの配布パッケージ取得 c-->>b: hogeのパッケージ b->>b: hogeのインストール deactivate b Note over a,b: PC1とPC2が同一LAN上でも台数分
のインターネットアクセスが必要

これをインターネットアクセスを伴わないように頑張ります。

sequenceDiagram title: LAN上で完結させるScoop利用 participant a as PC1 participant b as PC2 participant c as my_hogeの
配布サーバー
(LAN上のNAS) participant d as hogeの
配布サーバー
(インターネット上) a->>a: scoop install my_hoge activate a a->>c: my_hogeの配布パッケージ取得 c-->>a: my_hogeのパッケージ a->>a: my_hogeのインストール deactivate a b->>b: scoop install my_hoge activate b b->>c: my_hogeの配布パッケージ取得 c-->>b: my_hogeのパッケージ b->>b: my_hogeのインストール deactivate b Note over a,c: 配布サーバーがLAN上なのでインターネットアクセスは不要

Scoopで提供されるソフトウェアの一例

標準Bucket

  • 7zip
  • ADB
  • curl
  • Dart
  • Docker
  • Doxygen
  • ffmpeg
  • git
  • Go
  • Graphviz
  • iconv
  • Kotlin
  • neofetch
  • NodeJS
  • OpenSSH
  • Perl
  • PHP
  • Python
  • qemu
  • tar
  • wget
  • xz

Extras

  • Android SDK
  • Android Studio
  • Audacious
  • Audacity
  • Brackets
  • Calibre
  • Chromium
  • Eclipse
  • Emacs
  • Filezilla
  • Firefox
  • Flutter
  • Fontforge
  • Foobar2000
  • Gnucash
  • Google Chrome
  • IntelliJ IDEA
  • ImgBurn
  • LibreOffice
  • mkcert
  • MPC-BE
  • NetBeans
  • NextCloud
  • ONLYOFFICE
  • Paint.net
  • PDFSAM
  • Sublime Text
  • Typora
  • Unetbootin
  • VCランタイム
  • VcxSrv
  • vlc
  • VSCode
  • VSCodium
  • Wireshark

大抵のソフトウェアは揃っているという印象です。また、Javaについては専用のBucketがあり、LTSのJava8、Java11、現在最新版となるJava13の他Java14、Java15のEarly AccessやJavaFX/LibericaFX をJava11以降で開発[^1]する際は導入が一番楽なlibericaもあります。素晴らしい。

Scoopのインストール

スタートメニューからWindows PowerShellを実行します。

「Set-ExecutionPolicy RemoteSigned -scope CurrentUser」と「iwr -useb get.scoop.sh | iex」を実行します。前者は信頼できないスクリプトの実行を許可するコマンド、後者はscoopのインストール。

PS C:\Users\hogehoge> Set-ExecutionPolicy RemoteSigned -scope CurrentUser

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): y
PS C:\Users\hogehoge> iwr -useb get.scoop.sh | iex
Initializing...
Downloading scoop...
Extracting...
Creating shim...
Downloading main bucket...
Extracting...
Adding ~\scoop\shims to your path.
'lastupdate' has been set to '2020-01-13T12:24:20.3410884+09:00'
Scoop was installed successfully!
Type 'scoop help' for instructions.

以降はPowershellでないコマンドプロンプトからもscoopが利用可能です。

GitだけはScoopでインストール…(Windows版のGitをインストールしていない場合)

gitコマンドをインストールしていない場合はscoopコマンドで後述するBucketの追加時に必要になるので先にインストールします。ついでに7zも必要みたいなので一緒にインストールされます。

C:\Users\hogehoge>scoop install git
Installing '7zip' (19.00) [64bit]
7z1900-x64.msi (1.7 MB) [=====================================================================================] 100%
Checking hash of 7z1900-x64.msi ... ok.
Extracting 7z1900-x64.msi ... done.
Linking ~\scoop\apps\7zip\current => ~\scoop\apps\7zip\19.00
Creating shim for '7z'.
Creating shortcut for 7-Zip (7zFM.exe)
'7zip' (19.00) was installed successfully!
Installing 'git' (2.24.1.windows.2) [64bit]
PortableGit-2.24.1.2-64-bit.7z.exe (41.9 MB) [================================================================] 100%
Checking hash of PortableGit-2.24.1.2-64-bit.7z.exe ... ok.
Extracting dl.7z ... done.
Linking ~\scoop\apps\git\current => ~\scoop\apps\git\2.24.1.windows.2
Creating shim for 'git'.
Creating shim for 'gitk'.
Creating shim for 'git-gui'.
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)
Creating shortcut for gitk (gitk.exe)
Running post-install script...
'git' (2.24.1.windows.2) was installed successfully!

オレオレBucketを作る

Buckets

A command-line installer for Windows. Contribute to ScoopInstaller/Scoop development by creating an account on GitHub.

Bucketを自分で作るにあたって必要なものは2つあるようで、

  • パッケージ情報を記載するJSONファイルを格納するgitリポジトリ
  • 配布ファイル(一般にネットワークアクセス可能な場所)

今回自分でBucketを準備することにしたのは、一般にWindowsではexeの実行でソフトウェアをインストールすることが多いけれども、最近メタインストーラーとでも言うべきちっちゃいインストーラーを実行させておいて、インストーラーの実行中にインターネットから配布ファイルをダウンロードさせるという悪習慣が広まり続けているため、同じ環境を構築しようとするとPCの台数分だけ配布ファイルをダウンロードするためのパケット通信が必要になる場合が増えているから。

この配布ファイルが一般にはもの凄くファイルサイズが大きくて、とてもじゃないけどやってられんということと、Debianのaptに代表されるターミナルからのコマンドによるパッケージの取捨選択が未だにWindowsに用意されない現状があって、これを打破する手段としてScoopが使えそうというところ。

こんな方法で実現します。

sequenceDiagram title: gitリポジトリをSyncthingで同期させる participant a as PC1 participant b as PC2 participant c as my_hogeの
配布サーバー
(LAN上のNAS) participant d as Syncthing
(概念) a->>c: 配布パッケージの格納 c-->>a:   a->>a: urlにNASを指定した
JSONファイルを作成 a->>a: git commit Note over a: PC1で該当ソフトを
インストール可能 a->>a: scoop update a->>a: scoop install my_hoge activate a a->>c: my_hogeの配布パッケージ取得 c-->>a: my_hogeのパッケージ a->>a: my_hogeのインストール deactivate a a->>a: git push Note over d: 変更処理は非同期で
行われるので複数
から同時に走ると
危うい d->>d: 変更検知 d->>a: 変更取得 a-->>d:   d->>b: 変更反映 b-->>d:   b->>b: git pull Note over b: PC2で該当ソフトを
インストール可能 b->>b: scoop update b->>b: scoop install my_hoge activate b b->>c: my_hogeの配布パッケージ取得 c-->>b: my_hogeのパッケージ b->>b: my_hogeのインストール deactivate b

Chocolateyと比較して

Scoopと同じ目的で使われるソリューションとしてChocolateyがあります。というか、Chocolateyの方が先にできたのでそれを元にしてScoopが作られたと考えるのが自然ですが、Chocolateyのデメリットとして

  • UACを回避できない
  • パッケージのアンインストールがパッケージの質に依存する
  • サードパーティーリポジトリを設定できない

という点があり、パケット通信量を減らす目的のみであればChocolatey.Serverを準備すれば実現できそうですが、要求仕様として

  • .NET Framework 4.6以上
  • 最低50GBの空き領域があるWindows BOX
  • 最低8GBのRAM
  • IISとポートのブロック解除

が挙げられていてこれは完全に企業向けですねという話になります。

ただ、これが実現できる場合はChocolateyの導入でも今回の目的は達成できるのでChocolateyでも良いと思おいます。

配布パッケージとgitリポジトリの管理方法について

オレオレBucketに必要なgitリポジトリはインストールできるパッケージの情報になるので、環境を構築したいWindows端末で共有したいところ。GitLabのプライベートリポジトリにしといて同期するんでも勿論いいし、普通はそうすると思いますが、以下のメリットが得られそうなのでSyncthingでbareリポジトリを同期することにします。

  • インターネットに接続していなくても同一LAN内であれば情報を同期できる
  • 基本的に自宅で済ませる1

この方式のデメリットは

  • 最初にSyncthingのインストールとディレクトリの同期を済ませる必要がある
  • gitを使う割に複数のPCから更新が同時に行われると手動で復旧しないといけないので基本一人使用2

なお、Syncthingについては以下で紹介しています。

マルチプラットフォームファイル同期ソフトSyncthingのご紹介

そして、今回そもそもの目的の一つがパッケージファイルが大きいことなので、パッケージファイルの置き場所として自宅LAN上のHTTPサーバーを使用します。Raspberry Piでもいいのですが、NetgearのReadyNASがあるので今回はこのReadyNASのHTTPサーバー機能を利用することでインターネットに接続しない状態での環境構築を実現します。

Syncthingで同期ディレクトリを作成

まずJSONファイルを格納するgitのbareリポジトリ用のSyncthing0のディレクトリを作成します。私はWindowsではSyncthingはSyncTrayzorを使っているので、Synctrayzor経由のWeb GUI画面で操作します。

「フォルダーを追加」を選択。

必要な事項を設定します。基本的にはフォルダー名とフォルダーパスをちゃんと指定すれば問題はありません。他のPCに同期する場合は共有タブで共有リクエストを送るPCを選ぶくらいでしょうか。

ディレクトリ内にgitのbareリポジトリを作る

Windows版のgitは入れてなかったので、WSL2からWindows側に移動してコマンドを実行という横着をしました。

$ cd /mnt/c/Users/hogehoge/SyncThing/ScoopBucket1/
$ mkdir scoopbucket1.git
$ cd scoopbucket1.git/
$ git init --bare --shared
Initialized empty shared Git repository in /mnt/c/Users/hogehoge/SyncThing/ScoopBucket1/scoopbucket1.git/

bareリポジトリ内にbucketディレクトリを作る

作成したbareリポジトリをcloneして作業していきます。すぐ上のディレクトリで作業するので相対パスでcloneしています。

$ cd /mnt/c/Users/hogehoge
$ git clone SyncThing/ScoopBucket1/scoopbucket1.git scoopbucket1.git
Cloning into 'scoopbucket1.git'...
warning: You appear to have cloned an empty repository.
done.

中に入ってbucketディレクトリを作ります。gitでのユーザ名とメールアドレスも(設定していない場合は)適当に。

$ cd scoopbucket1.git/
$ git config user.email "hogehoge@localhost"
$ git config user.name "hogehoge"
$ mkdir bucket
$ cd bucket/

gitリポジトリへの操作はここで行います。

JSONファイルを設える

App Manifests

A command-line installer for Windows. Contribute to ScoopInstaller/Scoop development by creating an account on GitHub.

JSONファイルが1ファイルにつき1パッケージに対応していれば良さそうなので、ここはひとまずサンプルとして書かれているJSONファイルを配置します。

{
    "version": "1.0",
    "url": "https://github.com/lukesampson/cowsay-psh/archive/master.zip",
    "extract_dir": "cowsay-psh-master",
    "bin": "cowsay.ps1"
}

このファイルは元々cowsay.jsonとしてbucketの中に格納されていますが、名前をオリジナルとは変更します3

ここではgit cloneしたディレクトリのbucketの下にmy_cowsay.jsonという名前で作成します。my_というプレフィックスを付けることでscoop search my__を実行してLANからインストールできるパッケージを表示できます。

作成したら、とりあえずcommitとpushします。これでSyncthing上でも同期されます。

$ git add my_cowsay.json
$ git commit -m "add my_cowsay"
$ git push -u origin master

ScoopにオレオレBucketを追加

scoop bucket addコマンドの引数に作業しているgitリポジトリを追加します。

C:\Users\hogehoge>scoop bucket add ScoopBucket1 scoopbucket1.git
Checking repo... ok
The ScoopBucket1 bucket was added successfully.

さっき追加したmy_cowsayをインストールします。

C:\Users\hogehoge>scoop install my_cowsay
Installing 'my_cowsay' (1.0) [64bit]
Downloading https://github.com/lukesampson/cowsay-psh/archive/master.zip (-1 B)...

WARN  Warning: No hash in manifest. SHA256 for 'master.zip' is:
    c65cdfbf43b15f65742831f812003a92abeaa5d416374d5d75a53388d0b59148
Extracting master.zip ... done.
Linking ~\scoop\apps\my_cowsay\current => ~\scoop\apps\my_cowsay\1.0
Creating shim for 'cowsay'.
'my_cowsay' (1.0) was installed successfully!

C:\Users\hogehoge>cowsay

            ^__^
            (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ちゃんとインストールされました。今回はサンプルのままなのでパッケージをインターネットからダウンロードしていますが、JSONファイルに記載されているファイルをLAN上のHTTPサーバーに変更することでパケット通信量を削減します。

例として202MBあるDart SDKをLAN内からインストールする

ReadyNASのHTTPサーバー仕様

最近のNASは色々な機能が付いているものがほとんどですが、我が家で使っているNetgearのReadyNAS 104は既に生産終了している古いモデルです。ですが、NASに格納されているファイルはHTTP/HTTPSサーバー機能を使用してWebブラウザからダウンロードすることができます。但し、少し癖があります。

HDDの名前が何故かTOSHIBA…

HTTPサーバー機能を有効にする

システム→設定と辿ってHTTPサーバ機能が有効になっていることを確認します。

配布ファイルをNASに格納して見れる様にする

scoopのDart SDKのJSONを見てみると…

Main/bucket/dart.json at master · ScoopInstaller/Main

📦 The default bucket for Scoop. Contribute to ScoopInstaller/Main development by creating an account on GitHub.
        "64bit": {
            "url": "https://storage.googleapis.com/dart-archive/channels/stable/release/2.7.0/sdk/dartsdk-windows-x64-release.zip",
            "hash": "c34a5b3160850b6d247f0c39c57668c90010af4e43d7f68347059c706d2c06b2"
        },

という記述があり、以下の特徴があることがわかります。

  • ファイル名が同一でディレクトリ名でバージョンを変えている

なので、NAS上にファイルを置く場合もファイル名を変えずにバージョンをディレクトリで掘ってその下にファイルを置くのが良いと判断し、【Scoop/Bucket/dartsdk/2.7.0】の下に置くことにしました。

ReadyNASの管理画面からボリュームを右クリックして設定に入り、HTTP機能を有効にします。

HTTPアクセスを可能にしたボリュームからダウンロードする場合のURLは http://HOST/VOLUME/以下 になるので、アクセスするURLは具体的に http://192.168.1.126/Scoop/Bucket/dartsdk/2.7.0/dartsdk-windows-x64-release.zip になります。

ということで、この前提を踏まえてJSONファイルをbucketの下にmy_dart.jsonとして以下の内容で作ります。バージョンチェック、update関連の記載は全て削除します。

{
    "version": "2.7.0",
    "license": "BSD-3-Clause",
    "homepage": "https://www.dartlang.org/",
    "description": "SDK for the Dart programming language",
    "extract_dir": "dart-sdk",
    "env_add_path": "bin",
    "architecture": {
        "64bit": {
            "url": "http://192.168.1.126/Scoop/Bucket/dartsdk/2.7.0/dartsdk-windows-x64-release.zip",
            "hash": "c34a5b3160850b6d247f0c39c57668c90010af4e43d7f68347059c706d2c06b2"
        }
    }
}

作り終わったらgitに登録。

$ git add .
$ git commit -m "add my_dart"
$ git push -u origin master

パッケージ情報をアップデートしてインストールします。

C:\Users\hogehoge>scoop update
Updating Scoop...
Updating 'main' bucket...
Updating 'ScoopBucket1' bucket...
 * 1d9e003 update url my_dart                                            4 minutes ago
Scoop was updated successfully!
C:\Users\hogehoge>scoop install my_dart
Installing 'my_dart' (2.7.0) [64bit]
dartsdk-windows-x64-release.zip (197.3 MB) [==================================================================] 100%
Checking hash of dartsdk-windows-x64-release.zip ... ok.
Extracting dartsdk-windows-x64-release.zip ... done.
Linking ~\scoop\apps\my_dart\current => ~\scoop\apps\my_dart\2.7.0
'my_dart' (2.7.0) was installed successfully!

一回コマンドプロンプトを抜けるとdartにパスが通されて使えるようになります。

C:\Users\hogehoge>dart --version
Dart VM version: 2.7.0 (Fri Dec 6 16:26:51 2019 +0100) on "windows_x64"

この調子で環境構築に必要なコマンドや開発環境をインストールできるようにしていきます。

スポンサーリンク


  1. 特に初期導入時に時間がかかるので [return]
  2. またはSyncthingの設定で親PCを決めて更新は親からだけに限定する [return]
  3. バージョン管理がぐちゃぐちゃになるので [return]

comments powered by Disqus