使用库、二进制文件和模块文件限制项目中的模块功能可见性

Posted

技术标签:

【中文标题】使用库、二进制文件和模块文件限制项目中的模块功能可见性【英文标题】:Restrict module function visibility in a project with library, binary and a module file 【发布时间】:2022-01-19 00:16:02 【问题描述】:

我有一个包含三个文件的项目:

    模块文件 (src/foo.rs) 库文件 (src/lib.rs) 二进制文件 (src/main.rs)

我想在模块文件中拥有公共函数,其可见性仅限于库和二进制文件。

我曾尝试使用pub(crate)pub(super) 等,但无济于事。

我想以这样的方式设计项目结构:

    在将lib.rs 中的pub 函数用作依赖包时,只能从外部调用它。 foo.rs 中的所有函数都应该只对lib.rsmain.rs 可见。 main.rs 中的所有函数都应该是私有的。

EDIT1:我想要它,因为pub(crate) 会警告我死代码,而pub 不会。我不希望模块中有任何死代码。在大型项目的维护中,对调试和重构有很大帮助。

EDIT2:Rust Internals Thread

【问题讨论】:

main.rs 是否依赖 lib.rs 作为依赖项,您是否希望 main.rs 通过 lib.rs 访问 foo.rs @kmdreko 那同样的事情没有? 你的问题没有任何意义,xy 问题?我建议你忘记这个想法。至少你应该解释为什么你想要那个。 只有 lib.rs 中的 pub 函数——这就是 Rust 的自然工作方式;没有什么特别的需要。 main.rs 中的所有函数——它们是否是私有的并不重要,因为你一开始就不能将二进制文件用作依赖项。 foo.rs 中的所有函数 — 是什么让 your main.rs 与任何其他可能使用该库的 crate 不同? Rust 中没有任何东西有你信任的“朋友”箱子的概念。 @Stargatuer 我主要是在问lib.rsmain.rs 是否分别声明foo 模块。 【参考方案1】:
    pub 就是这样做的。 对于 foo.rs 中的这些函数,您需要使用 pub(crate)。 由于 main.rs 是二进制文件,因此无法导入,因此它们本质上都是私有的。

【讨论】:

以上是关于使用库、二进制文件和模块文件限制项目中的模块功能可见性的主要内容,如果未能解决你的问题,请参考以下文章

Linux编程中链接库的使用

带有库和二进制文件的 Rust 包?

rust 模块组织结构

VS2019 C++动态链接库的创建使用

Python常用标准库之os

Python常用标准库之os