はじめに
Rustのプロジェクトをcrates.ioで公開するときに使うコマンドがcargo publish
です。このコマンドはコンパイルが通るかどうかなどいくつかのチェックをし、ソースコード一式のアーカイブを作成し、crates.ioにアップロードするまでをまとめてやってくれます。
ここで「いくつかのチェック」と書いた通り、コンパイルが通るからと言ってcargo publish
できるとは限りません。また、crates.io側にもチェックがあります。この記事ではコンパイルが通るけどcargo publish
できないRustプロジェクトについて紹介します。
[depencencies]
の不備
これは一番よく知られていると思いますが、[dependencies]
は全てcrates.ioに登録されたクレートをバージョン指定で参照している必要があります。
以下の例はすべてNGです。
[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で弾かれます。