怒られて。
問題
$ cargo new Rust.A --bin error: Invalid character `.` in crate name: `Rust.A` use --name to override crate name
クレート名に.
が使えない……。GitHubリポジトリは使えるのに……。
要件
クレートを生成すると.git
ができてGitリポジトリになる。それをそのままGitHubへプッシュしたかった。
私はいつもGitHubリポジトリ名を{言語名}.{プロジェクト名}.{日時}
としている。今回もcargo new Rust.Pj.20190520123456
のようにしようと思ったら上記エラー。
使える文字
[A-Za-z_][A-Za-z0-9_-]*
要点は以下。
- 英数字
- 記号
_
-
- 先頭に使えない
-
- 数字
情報源
pub fn valid_name(name: &str) -> bool { if name.len() == 0 { return false } name.chars().next().unwrap().is_alphabetic() && name.chars().all(|c| c.is_alphanumeric() || c == '_' || c == '-') && name.chars().all(|c| c.is_ascii()) }
調べてみた
命名規則
- https://sinkuu.github.io/api-guidelines/naming.html
- https://github.com/rust-lang/rfcs/blob/master/text/0430-finalizing-naming-conventions.md
snake_caseを使うらしい。crate_name
などのように小文字かつ単語は_
で区切る。ただし一言を好む。_
も使わない単語が最善。
GitHubソースコード検索
- https://github.com/search?utf8=%E2%9C%93&q=language%3ARust&type=Repositories&ref=advsearch&l=Rust&l=
- すべてアルファベット小文字
- 区切文字
-
少数派は以下。
- 区切文字
_
-
,_
混在
さらに少数派となると以下。
-
,_
混在- 大文字小文字を併用して区切る(
-
,_
未使用)
試してみた
cargo new
コマンドでクレートを作成してみる。
エラー
先頭が数字
$ cargo new 0Rust-A --bin error: Package names starting with a digit cannot be used as a crate name use --name to override crate name
先頭がハイフン
$ cargo new -Rust-A --bin error: Found argument '-R' which wasn't expected, or isn't valid in this context USAGE: cargo new [OPTIONS] <path> For more information try --help
起動引数として扱われてしまっている。
名前をクォートしても同様。
$ cargo new '-Rust-A' --bin error: Found argument '-R' which wasn't expected, or isn't valid in this context USAGE: cargo new [OPTIONS] <path> For more information try --help
OK
2文字以降にハイフン
$ cargo new Rust-A --bin Created binary (application) `Rust-A` package
先頭がアンダーバー
$ cargo new _Rust-A --bin Created binary (application) `_Rust-A` package
解決(妥協)
クレートをそのままGitHubリポジトリとしても使うためにはどうするか。
案1 リポジトリを2つ作る
- {言語名}.{プロジェクト名}.{日時}
- .git
- src/
- {cargo new}/
- .git
- src/
- main.rs
- {cargo new}/
- ReadMe.md
- LICENSE.txt
これでは下層にある.git
まで管理されてしまうが、仕方ない。cargo new
で生成される.git
がCargo.toml
とどのような関係にあるかもわからないので下手にいじれない。
src
も2つあって紛らわしい。親側はcrate
としたほうがいいかも?
案2 {言語名}.{プロジェクト名}.{日時}
をやめる
Rustにかぎり。代わりに以下のようにする。
rust_{project_name}_{yyyymmddhhmmss}
以下のような構成にする。
- {cargo new
rust_プロジェクト名_日時
}/- .git/
- src/
- main.rs
- ReadMe.md
- LICENSE.txt
じつは最初、リポジトリ名のテンプレートとして.
でなく_
にすべきか迷った。いつかこういう事態が起きそうとは思っていた。
どうせ学習用であり再利用しないから、クソみたいな名前でいい。重複さえしなければ。そう思えば、もう何でもいい気がしてきた。
名前の付け方について以下のように考えた。
名前 | 観点 |
---|---|
rust_project_name_yyyymmddhhmmss |
今までのリポジトリ命名規則に近づけつつ、クレート生成時にエラーにならず、Rust命名規則に近づけた。重複しづらく検索しやすいはず。 |
ボツ案は以下。
名前 | 観点 |
---|---|
Rust_project_name_yyyymmddhhmmss |
今までのリポジトリ命名規則に近づけて言語名の先頭を大文字にする。snake_caseに反するため却下。 |
rust-project_name-yyyymmddhhmmss |
プレフィクス(言語名)とサフィックス(日時)の区切文字とプロジェクト名内の区切文字を区別する。混同しそうなので却下。 |