允许同一板条箱中的二进制文件使用库的模块,但不允许外部板条箱使用相同的模块

问题描述 投票:0回答:1

我在

src
目录下有三个文件:

src
|____ keys.rs // a 'sub-module' under `lib.rs`
|____ lib.rs
|____ main.rs // binary file

在我的

cargo.toml
中,我专门指定了
lib
bin
的路径,即:

[lib]
name = "lib"
path = "src/lib.rs"

[[bin]]
name = "urs" // name of my binary
path = "src/main.rs"

keys.rs
中,我定义了几个结构体和函数。

lib.rs
中,我声明
mod keys;
,即:

pub(crate) mod keys;

use [...]

main.rs
中,我想使用
keys
中的模块
lib
,所以我这样做:

use lib::keys;

use [...]

我想公开模块

keys
以在板条箱内的任何位置使用,但不允许在板条箱之外使用它,因此,我在
pub(crate)
中声明
pub(crate) mod keys;
时使用可见性修饰符
lib.rs

然而,货物告诉我这一点:

error[E0603]: module `keys` is private
 --> src/main.rs:5:10
  |
5 | use lib::keys;
  |          ^^^^ private module
  |
note: the module `keys` is defined here
 --> F:\rust_projects\sui-utils-rust\src/lib.rs:1:1
  |
1 | pub(crate) mod keys;
  | ^^^^^^^^^^^^^^^^^^^

我的问题:

是否有可能实现我想要实现的目标? IE。通过声明

pub mod keys;
,我将允许外部板条箱使用
keys
模块中的内容,如何在保留对
keys
模块的板条箱独占访问的同时防止这种情况?

rust module visibility
1个回答
0
投票

您只需更改项目结构即可做到这一点,如下所示:

  1. 使 keys.rs 成为共享模块:您可以将 lib.rsmain.rs 都可以访问的共享模块,而不是使 keys.rs 成为 lib.rs 的子模块.
  2. 修改lib.rs:删除 pub(crate) mod 键;来自 lib.rs.
  3. 的声明
  4. 修改 main.rs:不使用 use lib::keys;,直接引用 keys.rs 作为模块。 以下是修改文件的方法:

src/keys.rs

// Your structs and functions

src/lib.rs

mod keys;
// Rest of your library code

src/main.rs

mod keys;
// Rest of your binary code

fn main() {
    // You can use items from keys here
}

这使得密钥模块成为同一包内的二进制文件和库之间的共享模块。这样,它就不会暴露给外部板条箱,但您的二进制文件和库都可以使用它。

© www.soinside.com 2019 - 2024. All rights reserved.