Chienomi

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を通すための設定があるので、有効になっていることを確認すること。

Rubyの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 clone 'git://github.com/reasonset/purebuilder-simply.git'

PowerShellエイリアスの設定

PureBuilder Simplyは Windows 10をサポートし、PowerShell上で動作する。

ここの作業はまずまず複雑だ。

まだプロファイルの設定をしたことがない場合

まず、PowerShellを 管理者権限で 起動し、次のコマンドを実行する

Set-ExecutionPolicy RemoteSigned

管理者権限のPowerShellを閉じ、ユーザーとしてPowerShellを開いて、 次のコマンドでプロファイルを作成する。

New-Item -type file -force $profile

あるいは「PowerShell の開発者向け設定」から設定しても構わない。

共通の作業

プロファイルにPureBuilder Simplyを起動するための関数を書いておく。 次のようにして編集する。

notepad $Profile
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である。同じディレクトリにSourceBuildのディレクトリを作成したならば、

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で動作させるためのマニュアルが追加される予定だ。