LoginSignup
15
4

More than 3 years have passed since last update.

cargo publishできないRustプロジェクト

Last updated at Posted at 2019-12-03

はじめに

Rustのプロジェクトをcrates.ioで公開するときに使うコマンドがcargo publishです。このコマンドはコンパイルが通るかどうかなどいくつかのチェックをし、ソースコード一式のアーカイブを作成し、crates.ioにアップロードするまでをまとめてやってくれます。
ここで「いくつかのチェック」と書いた通り、コンパイルが通るからと言ってcargo publishできるとは限りません。また、crates.io側にもチェックがあります。この記事ではコンパイルが通るけどcargo publishできないRustプロジェクトについて紹介します。

[depencencies]の不備

これは一番よく知られていると思いますが、[dependencies]は全てcrates.ioに登録されたクレートをバージョン指定で参照している必要があります。
以下の例はすべてNGです。

Cargo.toml
[depencencies]
hoge = "*"
hoge = {path = "./hoge"}
hoge = {git = "https://github.com/..."}

ちなみにRust1.39からgitリポジトリへのdependencyでもversion指定されていればOKになったようです。

アーカイブが大きすぎる

現状crates.ioの制限で、アーカイブの最大サイズは10MBになっています。圧縮後で10MBなのでそうそう越えることはないでしょう。ただ、一部の巨大なクレートは数MBあったりするので、絶対越えないということはなさそうです。過去のIssueを見ていると、どうしても越えそうなら連絡すれば個別に制限を緩めてくれるようですが、現在もその運用なのかは不明です。

build.rsがsrcディレクトリを変更する

build.rsがRustのソースコードを生成するようなケースで生成先をsrcにしてはいけません。
"Case study: Code generation"に書かれている通り、targetディレクトリに生成して、include!マクロで取り込むようにしましょう。

フォルダへのシンボリックリンク

特定のプラットフォームでトラブルになるためだと思われますが、フォルダへのシンボリックリンクは禁止のようです。
ファイルへのシンボリックリンクはいまのところOKのようです。

特殊なファイル名

まず、UTF-8でないファイル名はダメです。例えばWindows環境でのCP932エンコードされた日本語ファイル名とかですね。さらにいくつかの記号入りファイル名もチェックされます。これらのチェックはサポートする全プラットフォームで正しくアーカイブを展開できるようにするためです。
ただ、UTF-8の日本語ファイル名などは通ってしまいます。なんとなくまずい環境もありそうですが…。

特殊なクレート名

昔nulクレートを公開したらWindows環境が壊れた、という事件がありました。Windowsではnulは特殊なファイル名でありクレート用のnulディレクトリが作れなかったためです。そのためnulやcomなどWindowsで特別な意味を持つクレート名はcrates.ioで弾かれます。

15
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
4