-I. 和有什么区别?和 Perl6 中的 -Ilib?

What is the difference between -I. and -Ilib in Perl6?

我有一个本地分布如下:

.
├── META6.json
└── lib
    └── Foo.pm6

perl6 -I. -e 'use Foo;'perl6 -Ilib -e 'use Foo;' 都编译并且 运行,那么我应该使用哪一个,为什么?

问这个问题的另一种方式是 "What is the difference betweening -I $dir-with-meta6-file and -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 中寻找 files/namespaces 提供的内容及其 version/api/auth

  • -Ilib 提供所有现有文件并将它们映射到可预测的命名空间 (Foo/Bar.pm6 -> Foo::Bar) 并将匹配任何 version/api/auth

通常在开发时使用 -Ilib,特别是在开始时,因为它比在 META6.json 文件中手动 adding/removing 条目更容易。如果您正在编写本地应用程序或不打算安装的东西,这基本上没问题。

但是!一旦为分发创建了 META6.json 文件,应该首选 -I.。手动维护可能会稍微多一些工作,但它有一些优点:

  • 它提供了一些基本的安装保证;我看到的一个常见问题是模块通过了测试但未能实际安装,因为安装时的预编译只能访问 META6.json 文件中列出的文件。

  • 它允许将多个命名空间映射到一个文件(我不鼓励这样做)。

  • 您可以将 Perl .pm 文件放在 Perl6 .pm6 文件旁边作为一种双语言分发,因为您可以明确地告诉 Perl6 使用哪些文件。 -Ilib 必须将所有 .pm.pm6 文件视为 Perl6,这与这个想法不兼容。