purescript/package-setsにコントリビュートしてみた(とUIライブラリの宣伝)

package-setsとは

package-setsとは、公式が管理している、各パッケージのリポジトリやバージョンが記載されたセットです。 このpackage-setsにおいて各パッケージのバージョンはただひとつだけ含まれており、package-setsに含まれたものはコンパイルが保証されています。package-sets自体にもバージョンのような概念があり(といってもタグなんですが)、package-setsが更新されたりすると新しくタグがきられます。

PureScriptのパッケージ管理はBowerという印象が強い方がまだ多くいますが、psc-packagespagoというものがあり、これらは指定したpackage-setsとタグをもとにパッケージをインストールできます。

余談ですが、この仕組みは裏を返せばpackage-setsにないものは管理できないということであり、かつてはpackage-setsに自分でパッケージを追加するか、forkして編集したpackage-setsを使うかしかなかったのですが、spagoというパッケージマネージャ兼ビルドツールが出てきて、package-setsをforkしなくてもpackage-setsにないパッケージを管理できるようになりました。

願望も含まれてますが、わたし的にはspago一強になるのではないかと思ってます。

さて、余談はさておき、そんなpackage-setsですが、package-setsに登録されているライブラリが増えるのはとても良いことだと思います。

最近package-setsにパッケージを追加したので、今日はpackage-setsの追加の仕方を紹介します。

前提条件

package-setsは基本的にどんなパッケージでも追加はウェルカムだそうです。 ただし、現時点では、以下の基準を満たしてなければいけません。

  • pulp versionをバージョニングに使用すること
  • pulp publishをつかってパッケージを公開すること
  • bower -i -pでインストールしたパッケージが正しく動くこと

pulpとは昔からあるビルドツールです。

pulp versionを使ってほしい理由は、タグがvから始まってほしいからだそうです。pulp versionvから始まるタグをつけてくれます。 pulp publishとは、パッケージをBowerにあげて、ドキュメントをPursuitというドキュメントサイトにアップロードをするコマンドです。配布方法がpackage-setsだけではなくBowerも存在しているためにこのコマンドで配布してね、ということみたいです。 bower -i -pでインストールしたパッケージが正しく動くことを期待するのも上記の理由でしょう。

とまぁまだBowerの存在感がしっかり残っています。

現状だと、事実上、ライブラリを書く時のみ、pulpとbowerは捨てにくいです。

しかしながら、以下のような動きが始まっており、ゆっくりと時間をかけてBowerの存在感がなくなっていくことを期待しましょう。

github.com

準備

package-setsにpackageを追加する前に以下の依存をインストールしておきましょう。

  • dhall
    • コマンド的な意味だとdhallとdhall-to-jsonが必要です
  • psc-package
  • jq
  • purs (purescriptのコンパイラ)

私の場合は、こういうスポットで使うとき用の雑なDockerイメージをもっていて、それをちょっと改変して使いました。 雑ですがインストール作業すらしたくなければ適宜変更して使ってください。

FROM node:10.14.0

ENV HOME /home/node

RUN set -ex \
  && apt-get update \
  && apt-get install -y lsof jq \
  && cd /tmp \
  # Install dhall
  && curl -fsSL -O https://github.com/dhall-lang/dhall-haskell/releases/download/1.21.0/dhall-1.21.0-x86_64-linux.tar.bz2 \
  && tar xvjf dhall-1.21.0-x86_64-linux.tar.bz2 && mv bin/dhall /usr/local/bin/dhall \
  && chmod +x /usr/local/bin/dhall \
  # Install dhall-to-json
  && curl -fsSL -O https://github.com/dhall-lang/dhall-haskell/releases/download/1.21.0/dhall-json-1.2.7-x86_64-linux.tar.bz2 \
  && tar xvjf dhall-json-1.2.7-x86_64-linux.tar.bz2 && mv bin/dhall-to-json /usr/local/bin/dhall-to-json \
  && chmod +x /usr/local/bin/dhall-to-json \
  # Install psc-package
  && curl -fsSL -O https://github.com/purescript/psc-package/releases/download/v0.5.1/linux64.tar.gz \
  && tar xvzf linux64.tar.gz && mv psc-package/psc-package /usr/local/bin/psc-package \
  && chmod +x /usr/local/bin/psc-package \
  # Install purs
  && curl -fsSL -O https://github.com/purescript/purescript/releases/download/v0.12.3/linux64.tar.gz \
  && tar xvzf linux64.tar.gz && mv purescript/purs /usr/local/bin/purs \
  && chmod +x /usr/local/bin/purs

USER node

WORKDIR $HOME/app

作業

とりあえず、package-setsをforkしてcloneしましょう。 package-setsは、dhallという言語で管理されているのでdhallを書くわけですが、知らなくても大丈夫です。 他のファイルを見れば書き方はわかります。src以下にもぐって、マネッコして書きましょう。

さて、書き終わったら、make setupを叩きます。 これで、packages.jsonってのが更新されてdiffにでてくるはずなので、中身を見て、自分が足したpackageが間違いなく足されているのかを確認しましょう。

そのあとは、自分の追加したpackageをverifyします。

たとえば、あなたがpackage-setsにeternal-force-blizzardというパッケージを追加したのであれば、psc-package verify eternal-force-blizzardと打ちましょう。

依存をインストールしてコンパイルを行います。無事に終了すればOKです。

まぁよくわかんなかったら、コントリビューションガイドに親切に書いてあるので見てみましょう。

PR

ここまでできたらあとはPRを送るだけです。今回は私もはじめてだったので一応「俺のライブラリ入れていい?」って感じでPRを送りました。 また、他人のパッケージもひとつ追加する必要があったのでそれも追加しました。たぶん他人のライブラリも前提条件を満たしていてverifyが通れば追加して問題なさそうです。実際に私のパッケージも既に一つ存在していました。

以下は私が送ったPRです。dhallの編集の仕方がわかんなかったら参考にしてください。

github.com

一度に大量に追加したのでかなり疲れました...。

夜中にPR送ったのですが、起きたらマージされていて、新しいpackage-setsがリリースされてました!ありがたい!!

とまぁ、ちょっとめんどくさいんですけど、簡単です!

宣伝

最近、ちゃんと業務で使えるものを目指して、PureScript向けのUIライブラリをつくりました。

purescript-freedomと言います。

npm dependencyはありません。

このパッケージは既存のパッケージで使いたいと思うものがなかったことが原因でつくったため、 既存のUIパッケージとの差別化がされています。

ガイドやサンプルプロジェクトも用意していて、すでに派生パッケージもいくつか公開しています。

ElmからPureScriptに興味を持った人、HalogenやPux、react-basicになにかしら気に入らないことがある人、「あぁ?なんだどういうもんかみてやろうじゃねえか?」という人、騙されたと思って見てくれると嬉しいです。

ホントに騙しちゃったらごめんなさい、許してね♡

2020/07/07 追記

新たにUIライブラリ、purescript-grainをリリースしました。 チューニングもしてあるのでそちらのほうがおすすめです。