いきなりcrates.ioに公開するのは怖いのでローカルで練習してみる

rustでツールを作成したので、簡単にインストールしてもらえるように公開だ! と、思ったものの初めてでいきなりcrates.ioに公開するのは、怖いのでローカルにレジストリを作成して一旦そこに対して公開してみるっていうのをやってみました。

※本物のcrates.ioに対する公開の方法は、探せば結構出てくるので割愛します。

ローカルにレジストリサーバを立てる

https://github.com/rust-lang/cargo/wiki/Third-party-registries

rustが公式に紹介しているサードパーティーレジストリでオープンソースのもから導入が簡単そうだったのでestuaryを選びました。

https://github.com/onelson/estuary

公式にサンプルのDockerfileを置いてくれてはいるのですが、もうちょっと使いやすくするためにdocker-compose.ymlを用意して、さらに簡単に使えるようにしました。

FROM rust:1-slim-buster

# Estuary relies on being able to run `git` on the command-line.
# It additionally uses the `git2` crate which indirectly depends on `libssl`.
RUN apt-get update && apt-get install -y \
  git \
  pkg-config libssl-dev \
  && rm -rf /var/lib/apt/lists/*

RUN cargo install estuary
version: 3

services:
  crates.io:
    build:
      dockerfile: Dockerfile
      context: .
    environment:
      ESTUARY_INDEX_DIR: "/var/lib/estuary/index"
      ESTUARY_CRATE_DIR: "/var/lib/estuary/crates"
      RUST_LOG: "actix_web=INFO,estuary=INFO"
      ESTUARY_BASE_URL: "http://localhost:7878"
    ports:
      - "7878:7878"
    volumes:
      - "./data/:/var/lib/estuary/"
    command: estuary

これらを適当なディレクトリに配置して、

docker compose up

とすればローカルでレジストリサーバを動かせます。

ローカルのレジストリに対して公開してみる

.cargo/config.tomlにローカルのレジストリを登録しておきます。

[registries]
estuary = { index = "http://localhost:7878/git/index" }

普通にインストールしていれば、ホームディレクトリの直下に.cargoディレクトリがあるはずです。

cargo login --registry estuary

適当なトークンを入力してログインします。

cargo publish --registry estuary

ローカルのレジストリに公開したcrateを使ってみる

[dependencies]
my-cool-package = { version = "1.2.3", registry = "estuary" }
cargo install --registry estuary my-cool-app