PureBuilder Simply on Windows
開発::util
序
「PureBuilder Simplyは実に素晴らしいソフトウェアであり、webを制作・公開する多くの人にとって理想的なツールになるだろう。 PureBuilder SimplyはLinux上で開発され、多くのUnixプラットフォーム上で動作する」
と説明されたらどのように受け止めるだろうか。 それを事実だとして受け止めるとしても、なかなか普及は厳しいことは一目瞭然であろう。
これはPureBuilder Simplyの基本的な説明であった。
だが、PureBuidler Simply 1.3あたりから「Windowsの場合はMSYS2上で動作させることができるだろう」というように説明が加えられた。
PureBuilder SimplyはWindowsでの動作を前提としていない。ここは(PureBuilder NGではなく)PureBuilderと同じ考え方である。 ただし、Zshで書かれていたPureBuilderと違い。PureBuilder Simplyは完全にUnixに依存しているわけではない。
Unix依存のコードはバージョンが進むに従って除々に置き換えられてきた。 そして、PureBuilder Simply 1.12における変更(特にWindowsを狙ったわけではない変更)によって、ついにPureBuilder Simplyは純Windows上で動作するようになった。
ここまでその検証ができなかったので、公式にWindowsをサポートしてこなかったが、ようやく検証できたのでその動作について解説しよう。
なお、このドキュメントはリポジトリ上のドキュメントと並行して書いているので、ほとんどの内容が重複することになるだろう。
動画
動画でみたい、という人はYouTubeで動画を公開しているのでそちらを観て欲しい
準備
Pandocのインストール
Pandocの公式サイトからinstallのページにいき、インストーラを入手し、インストールする。
一見単純そうであるが注意が必要な点がある。 それは、 Pandoc 2.10.1 Windows Installerによってインストールされるのが Pandoc 2.4であるということである。
PureBuilder
Simplyは新しいテンプレートシステムなどを利用するため、Pandoc2.4では
動作しない。 幸いにもWindowsのダウンロードページにあるZIPのPandocは2.10である。
そこで、インストーラでPandocを導入したあと、ZIPをダウンロードし、ZIPにあるファイルでC:\Program Files\Pandoc
以下のファイルを上書きする。
これで、PandocにPATHの通った状態でPandoc 2.10をインストールできる。
Rubyのインストール
RubyInstallerを使って最新版を普通に導入すれば良い。
このとき、 PATHを通すための設定があるので、有効になっていることを確認すること。
Git for Windowsのインストール
Git for Windows をインストールする。
Windows Terminalのインストール (オプション)
Windows上でPureBuilder Simplyを動作させるにはWindows PowerShellを必要とする。
普通にPowershellを起動してもいいのだが、Windows Terminalを使えばより便利に感じられるかもしれない。
エディタのインストール (オプション)
ドキュメントや設定ファイルを記述するのに適したエディタがあると良いだろう。
Visual Studio CodeやAtomがおすすめだ。
PureBuilder Simplyのインストール
PowerShellで次のようにする。
(.ps1
スクリプトとして実行しても良い)
cd $Env:LocalAppData
'git://github.com/reasonset/purebuilder-simply.git' git clone
PowerShellエイリアスの設定
PureBuilder Simplyは Windows 10をサポートし、PowerShell上で動作する。
ここの作業はまずまず複雑だ。
まだプロファイルの設定をしたことがない場合
まず、PowerShellを 管理者権限で 起動し、次のコマンドを実行する
Set-ExecutionPolicy RemoteSigned
管理者権限のPowerShellを閉じ、ユーザーとしてPowerShellを開いて、 次のコマンドでプロファイルを作成する。
New-Item -type file -force $profile
あるいは「PowerShell の開発者向け設定」から設定しても構わない。
共通の作業
プロファイルにPureBuilder Simplyを起動するための関数を書いておく。 次のようにして編集する。
$Profile notepad
function PureBuilder-Simply { ruby $Env:LocalAppData/pbsimply-pandoc.rb $Args }
function PureBuilder-Server { ruby $Env:LocalAppData/pbsimply-testserver.rb $Args }
これでコマンドとしてPureBuilder-Simply
及びPureBuilder-Server
が使えるようになった。
もちろん、ここではPowerShellっぽい名前にしたが、もっと短い名前にしても構わない。
Open PowerShell Here (オプション)
Windows
Terminalを入れた場合、エクスプローラのアドレスバーにwt -d .
と打てばそこでWindows
Terminalを開けるのだが、PowerShellの場合は引数がかなり長いので、次のようにして右クリックで開けるようにしてあげると良いだろう。
(.reg
としてレジストリエディタで実行すれば良い)
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\powershell_here]
@="Open PowerShell Here"
[HKEY_CLASSES_ROOT\Directory\shell\powershell_here\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command Set-Location -LiteralPath '%L'"
[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell_here]
@="Open PowerShell Here"
[HKEY_CLASSES_ROOT\Directory\Background\shell\powershell_here\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command Set-Location -LiteralPath '%V'"
プロジェクトの作成
プロジェクトディレクトリの用意
任意の場所にプロジェクトディレクトリを作成する。
ソースディレクトリとビルドディレクトリが必要であることを忘れてはいけない。
設定ファイル
ソースディレクトリには .pbsimply.yaml
が必要だ。
必須なのはoutdir
である。同じディレクトリにSource
とBuild
のディレクトリを作成したならば、
outdir: ../Build
のように記述する。
そしてWindowsで(も)ビルドする場合、もうひとつ必須のオプションがある。それがdbstyle
だ。
dbstyle
は主にデータベースの互換性・可搬性のためのオプションだが、これで指定されない場合、Ruby
Marshal形式でデータベースが作られる。 ところが、Windows上ではRuby
Marshal形式のデータはうまく読めないので、dbstyle
で他のフォーマットを使う必要がある。
PureBuilder Simply
1.12以降でjson
またはoj
を使うことができるが、oj
は追加ライブラリが必要なのでjson
にしておくと良い。また、まだ公開されていないが、PureBuilder
Simply
1.14ではyaml
が指定できるようになっている。このほうが支障をきたす可能性が少なく、推奨される。
つまり、最低限必要なのは次のようになる。
outdir: ../Build
dbstyle: json
ビルド
ここまでくればあとは簡単だ。ソースディレクトリ上で端末を開く。
方法は、Windows
Terminalを使う場合はExplorerのアドレスバーにwt -d .
と打ち込む。
素のPowerShellを使う場合は前述のレジストリを利用して右クリックすら開けばいいだろう。
あとはエイリアスで設定したとおり、
PS> PureBuilder-Simply article
のようにしてビルドすれば良い。(引数はビルドする対象ディレクトリ)
互換性のための諸注意とTIPS
plugins
プラグイン自体は普通にWindowsでも動作するのだが、これは
processor scriptfile document
の形式で起動される。
processor
は対応している拡張子であればそれに合わせたものが起動され、そうでなければperl
コマンドに渡される。
だが、これはUnixに合わせた仕様で、Windowsでは恐らくうまく動作しない。
Windowsでもビルドする場合、pluginsはWindowsにおいて単純にコマンド名で起動できる状態になっているインタープリタを利用する拡張子に限る必要がある。
最も確実なのは、全てRubyで書き、拡張子を.rb
にすることだ。(ここまでで、Rubyは単純なコマンドruby
で実行できるようになっているはずだからだ)
このあたりのメカニズムは全面的にUnixの仕組みに頼っており、単純なコマンドによって実行できるようにすることはWindowsでは手動で用意されねばならない。
PATHが通ってない場合はどうすればよいか
Unixシステムの場合は実行ファイルは必然的にコマンドとして認識されるようになっている。
一方、Windowsは「コマンドとして実行したいファイルは別々のディレクトリにあり、実行したいのなら個別にPATH
に入れる」というのが流儀である。(めんどくさい)
「環境変数」で検索すれば環境変数を設定するところが出てくるのでそこでPATH
に追加してあげれば良いのだが、もうちょっとまともなソリューションとして、リンクファームを作る、というのがある。
これもUnixと比べると相当筋悪なのだが、例えば%LocalAppData%
以下にbin
を作ってそこをPATH
に含めるようにして、あとはそのbin
ディレクトリにシンボリックリンクを置いていけばいい(Windowsではシンボリックリンクを作れるのはAdminだけなのでなかなか面倒である)。
しかし、これにはまだ問題がある。ウィンドウを生成するGUIプログラムはこれで良いのだが、この方法だとコマンドラインツールは起動されたときにウィンドウを生成し、実行が終了するとウィンドウを閉じてしまう。(PATH
上のシンボリックリンクはシステムで名前解決されて起動されるわけではなく、start
の引数になるため)
方法はいろいろあるが、結局のところPATH
をいじるのが比較的マシであるようだ。
Windowsで使えるようになった経緯と感触
もちろん前提として、PureBuilder Simplyが、「Rubyで、なるべくクロスプラットフォームに書く」を心がけてきた事情もあるのだが、RubyがMinGW上で動作していることと、WindowsがややUnixに寄せてきていることが結構大きい。
まず、RubyはネイティブWindows環境ではなくMinGW上で動作する。
これによってfork
が使えるようになったりはしないのだが、ディレクトリセパレータに/
を使っても支障がないようになっている。
(いや、MinGWによるところではなく、Ruby自体によるところなのかもしれないが)
また、最近のWindowsはUnixに寄せてきてもいる。 だが、注意しないと、
- 同じコマンドはあるが引数のとり方は違う
- クォートの扱いが違う
- ワイルドカードの展開はシェル側ではやってくれない
-
で始まるオプションがあったりするが、必ずしもそうとは限らない- fork(2)はない
- コマンドによってインストールしたプログラムを起動する前提になっていない
- シンボリックリンクの解決はシステムでなく
start
がやっている - 置換やパイプなどは、それらが噛み合うようにそもそも設計されていない
- 設計思想や挙動などがまちまちのものをちぐはぐに組み合わせることになり、予期しないことが頻繁に起きる
という問題にハマることになる。 ただ、(PureBuilder
Simply側で解消しているとはいえ)シェル自身がディレクトリセパレータに/
を使うことを受け入れていることは大きい。
結局のところWindows上で動作させると、「コマンドラインの使い心地がすごく気持ち悪い」という点に感想が集約されてしまうし、(いくらか性能は低下するが)WSLを使うほうがずっと使い心地は良い。 結局のところ手順も簡単なので、「WSLでいいんじゃないかな」と思ってしまったりもする。
とはいえ、Windowsの歩み寄りの結果PureBuilder SimplyがWindowsでも動作するようになったわけだし、Windows上で動作することは非常に大きいだろう。
PureBuilder Simply 1.14ではデータベース形式にYAMLがサポートされると共に、Windowsで動作させるためのマニュアルが追加される予定だ。