我有一个本地分布如下:
.
├── META6.json
└── lib
└── Foo.rakumod
raku -I. -e 'use Foo;'
和 raku -Ilib -e 'use Foo;'
都可以编译和运行,那么我应该使用哪个,为什么?
问这个问题的另一种方式是“-I $dir-with-meta6-file 和 -I $dir-without-meta6-file 之间有什么区别?”。在此答案中,
-I.
将在技术上指代 -I $dir-with-meta6-file
,而 -Ilib
将指代 -I $dir-without-meta6-file
。另请注意,这涵盖了use lib '.'
和use lib 'lib'
-I.
和-Ilib
的区别可以简单总结一下:
-I.
将查看 META6.json
提供的文件/命名空间及其版本/api/auth
-Ilib
提供所有现有文件并将它们映射到可预测的命名空间(Foo/Bar.rakumod
-> Foo::Bar
)并将匹配任何版本/api/auth
通常
-Ilib
在开发时使用,特别是在开始时,因为它比在 META6.json
文件中手动添加/删除条目更容易。如果您正在编写本地应用程序或不打算安装的东西,这基本上没问题。
但是!一旦为分发创建了
-I.
文件,就应该首选 META6.json
。手动维护可能会稍微多一些工作,但它有一些优点:
它提供了一些基本的安装保证;我看到的一个常见问题是模块通过了测试但未能实际安装,因为安装时的预编译只能访问
META6.json
文件中列出的文件。
它允许将多个命名空间映射到单个文件(我不鼓励这样做)。