web-dev-qa-db-ja.com

ローカルの未公開のクレートの使用方法

ライブラリを作成しました:

cargo new my_lib

そのライブラリを別のプログラムで使用したい:

cargo new my_program --bin
extern crate my_lib;

fn main {
    println!("Hello, World!");
}

これを機能させるには何をする必要がありますか?

それらは同じプロジェクトフォルダにありません。

.
├── my_lib
└── my_program

うまくいけば、これは理にかなっています。

貨物ガイド に従ってパスをオーバーライドできると思いましたが、

この機能を使用して、ローカルの未公開のクレートを見つける方法をCargoに指示することはできません。

これはRust(1.3)の最新の安定バージョンを使用している場合です。

69
Andre S.

実行可能ファイルのCargo.tomlに依存関係セクションを追加し、パスを指定します。

[dependencies.my_lib]
path = "../my_lib"

または同等の代替TOML:

[dependencies]
my_lib = { path = "../my_lib" }

ローカルパスの代わりにgitリポジトリを使用する方法など、詳細については、 依存関係を指定するための貨物ドキュメント を確認してください。

90
Shepmaster

mvn installに相当するものを探していました。この質問は私の元の質問とまったく同じではありませんが、私の元の質問に出くわしてここのリンクをたどった人は、より完全な答えを見つけるでしょう。

答えは「mvn installに相当するものはありません。Cargo.tomlファイルにパスをハードコーディングする必要があるためです。これはおそらく他の人のコンピューターでは間違っているでしょうが、かなり近いものになります。」

既存の答えは少し簡潔で、実際に物事を機能させるためにもう少し手を伸ばさなければならなかったので、ここで詳細を説明します。

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0432]: unresolved import `embroidery_stitcher`
 --> re5/src/main.rs:5:5
  |
5 | use embroidery_stitcher;
  |     ^^^^^^^^^^^^^^^^^^^ no `embroidery_stitcher` in the root

rustc --explain E0432には、Shepmasterの答えを反映した次の段落が含まれています。

または、外部クレートからモジュールを使用しようとした場合、extern crate宣言(通常はクレートのルートに配置されます)を見逃している可能性があります。

extern crate core; // Required to use the `core` crate

use core::any;

useからextern crateに切り替えると、これがわかりました。

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling embroidery_stitcher v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/embroidery_stitcher)
warning: function is never used: `svg_header`
 --> embroidery_stitcher/src/lib.rs:2:1
  |
2 | fn svg_header(w: i32, h: i32) -> String
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0603]: function `svg_header` is private
 --> re5/src/main.rs:8:19
  |
8 |     let mut svg = embroidery_stitcher::svg_header(100,100);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

その関数の前でpubを叩かなければなりませんでした

pub fn svg_header(w: i32, h: i32) -> String

今では動作します。

0
Mutant Bob