How to use a local unpublished crate?

后端 未结 2 976
一向
一向 2020-11-28 23:13

I\'ve made a library:

cargo new my_lib

and I want to use that library in a different program:

cargo new my_program --bin


        
相关标签:
2条回答
  • 2020-11-28 23:32

    I was looking for an equivalent to mvn install. While this question is not quite a duplicate of my original question, anyone who stumbles across my original question and follows the link here will find a more complete answer.

    The answer is "there is no equivalent to mvn install because you have to hard-code the path in the Cargo.toml file which will probably be wrong on someone else's computer, but you can get pretty close."

    The existing answer is a bit brief and I had to flail around for a bit longer to actually get things working, so here's more detail:

    /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 includes this paragraph that echos Shepmaster's answer:

    Or, if you tried to use a module from an external crate, you may have missed the extern crate declaration (which is usually placed in the crate root):

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

    Switching from use to extern crate got me this:

    /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);
      |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    I had to slap a pub on the front of that function

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

    Now it works.

    0 讨论(0)
  • 2020-11-28 23:33

    Add a dependency section to your executable's Cargo.toml and specify the path:

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

    or the equivalent alternate TOML:

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

    Check out the Cargo docs for specifying dependencies for more detail, like how to use a git repository instead of a local path.

    0 讨论(0)
提交回复
热议问题