CargoないしRustのパッケージレジストリといえばcrates.ioで、ここにpublishしておけばcargo install ...
でインストール可能になるわけですが、Rustで書いたオレオレツールやClosedな環境でのみ使うツールを公開するわけにはいかないので、なにかいい方法はないかな〜と探してみて一番楽そうだった方法のメモ。
あくまで「Closedな環境」が前提。Publicにしたらやばい。
準備
「Cargo Alternate Registryを使って」とまるで自作したかのようないい振りだけど感謝しながら既成ツールを使う。
Cargoは使える状態だとして、CargoリポジトリのWikiに記載されていたcargo-http-registryを使う。
cargo install cargo-http-registry
やる
レジストリとして使うディレクトリへのパスを渡すだけ。
お試しで/tmp
あたり作っておけば良さそう。パスが存在しなければ勝手に作ってくれる。
cargo-http-registry /tmp/registry
これでレジストリの準備はおわり。
レジストリを使うための設定
このレジストリをcargo
コマンドが認識できるように~/.cargo/config.toml
に次を追記しておく。
ポートは環境によって変わりそう。cargo-http-registry
を実行して生成されたconfig.json
に記載されたポートに合わせる。
# ~/.cargo/config.toml
[registries]
my-registry = { index = "http://127.0.0.1:62159/git" }
fileプロトコルでも使えるみたいなので、ファイルサーバーにレジストリを設置しておくみたいな場合はそっちでも良さそう。
クレート公開側の設定
cargo publish
で公開したいので、そのためのアレコレ。
自前レジストリにログインする
ログインする。
> cargo login --registry=my-registry
please paste the token found on http://127.0.0.1:62159/me below
<何でもいいので適当に入れておく>
Login already logged in
トークンはこの際何でもいいので適当に入れる。Login already logged in
になればOK。
適当なクレートを公開してみる
ハローワールドを公開してハローワールドしてみる。
cargo new my_crate_bin && cd my_crate_bin
cargo publish --registry=my-registry --allow-dirty
正しく公開できるとcargo-http-registry
で指定したディレクトリ直下にmy_crate_bin-0.1.0.crate
が爆誕しているはず。
公開方法としてはコレで良いですが、公開するであろうパッケージのCargo.toml
に次を追記しておくと、crates.ioに万が一にでも上がってしなうことはなくなる(そもそもログインしていなければ上がることはないが)。
publish = ["my-registry"]
cargo-http-registryのREADMEで初めて知った。
オレオレクレートを使ってみる
自分以外の誰かが使うことを想定して。
もちろん利用者も~/.cargo/config.toml
に自前レジストリを使うための設定が必要になる。
また、(環境変数でもコントロール可能なので必須ではないが)HTTPプロトコルでアクセスするならnet.git-fetch-with-cli
をtrue
にしておく。
# ~/.cargo/config.toml
[registries]
my-registry = { index = "http://127.0.0.1:62159/git" }
[net]
git-fetch-with-cli = true
これで利用者側の準備おわり。インストールしてみる。
cargo install my_crate_bin --registry=my-registry
# net.git-fetch-with-cliの設定を書かないままHTTPでやり取りするならこっち
CARGO_NET_GIT_FETCH_WITH_CLI=true cargo install my_crate_bin --registry=my-registry
インストールできたはず。
> my_crate_bin
Hello, world!
OK。もういらんので消す。
> cargo uninstall my_crate_bin
Removing /Users/sk/.cargo/bin/my_crate_bin
おわりに
Cargo Wikiに記載されている代替ツールはいくつか検討してみたが、(自作するモチベーションはなくて)コレが一番自分のユースケースにあってそうだった。
(Crate?Package?わからん)