やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

クレート名にドット.が使えない

 怒られて。

問題

$ 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())
    }

調べてみた

命名規則

 snake_caseを使うらしい。crate_nameなどのように小文字かつ単語は_で区切る。ただし一言を好む。_も使わない単語が最善。

GitHubソースコード検索

 GitHubソースコード検索してリポジトリ名を見てみた。

  • すべてアルファベット小文字
  • 区切文字-

 少数派は以下。

  • 区切文字
    • _
    • -,_混在

 さらに少数派となると以下。

  • -,_混在
  • 大文字小文字を併用して区切る(-,_未使用)

試してみた

 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
    • ReadMe.md
    • LICENSE.txt

 これでは下層にある.gitまで管理されてしまうが、仕方ない。cargo newで生成される.gitCargo.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 プレフィクス(言語名)とサフィックス(日時)の区切文字とプロジェクト名内の区切文字を区別する。混同しそうなので却下。