考虑我有一个包含private
或package
模块的复杂树的大型库包 - 我们称之为funnylib
。最终用户不希望直接触摸内部模块(如funnylib.foo
,funnylib.bar
等),所以我想提供外部接口 - 就像这样:
funnylib.d:
public import funnylib.foo;
public import funnylib.bar;
public import funnylib.baz;
最终用户只需导入import funnylib
。问题是D不允许同时拥有funnylib.d
和funnylib/
。
D中是否有类似“默认包模块”的内容,就像Python中有__init__.py
一样?如果不是,上述设计的正确方法是什么?
Update1:我考虑将iternal模块移动到funnylib_private
这样的包,因此funnylib
将导入正常,但这会降低保护成本(非常不受欢迎),因为funnylib将不再访问package
受保护的符号,并将导致令人不快的文件布局。
答案 0 :(得分:1)
创建一个简单的all
模块,其中包含用于导入库的公共导入
module funnylib.all;
public import funnylib.foo;
public import funnylib.bar;
public import funnylib.baz;
答案 1 :(得分:1)
您不能拥有同名的模块和包。因此,例如,Phobos无法拥有std/algorithm.d
和std/algorithm/sorting.d
。 std/algorithm.d
和std/algorithm
会发生冲突。典型的事情是ratchet freak describes,并使用名为all
的模块,该模块公开导入该包中的所有模块。但是如果你想隐藏你正在使用子模块的事实,那么你可以简单地做一些像
funnylib.d
_funnylib/foo.d
_funnylib/bar.d
_funnylib/baz.d
而不是文档_funnylib
在任何地方,但这对ddoc不起作用,因为它将为每个_funnylib
模块生成文档,并且它将生成的最多for funnylib.d
是模块文档,因为它没有任何文档符号。模块系统的设计并不是说你要隐藏模块,就像你想要的那样。
现在, 目前是proposal under discussion,因为它可以在模块太大时将模块干净地拆分成一个包(例如,当你拆分时{{1}进入std.algorithm
,std.algorithm.search
等明确使用std.algorithm.sorting
的代码即使现在是std.algorithm.countUntil
也不会中断。一旦整理好了,你可以使用它,但文档仍然会为每个子模块完成,而不是你的超级模块。它实际上是一种转换代码的方法,而不是试图隐藏你正在拆分模块的事实。它基本上只相当于使用std.algorithm.search.countUntil
模块但具有一些语义糖,以避免在包曾经是单个模块的情况下破坏代码。