刷新预编译的 perl6 模块的最佳方法是什么?

What is the best way to flush precompiled perl6 modules?

我正在尝试重构一些代码。我的方法(使用 vi)是将我的旧库从 /lib 复制到 /lib2。这样我就可以破解大部分内容,但仍然有一个框架可以重构。

所以我继续将 mymain.p6 header 从 use lib '../lib'; 更改为 use lib '../lib2';。然后我删除了 ../lib2/mylibrary.pm6 中的一大块行,并确保 :w 正在做我期望的事情。

想象一下,尽管我的程序已被大量删除,但我的程序仍然可以完美运行,这让我感到惊讶。它甚至在我 rm -R /lib 时也能工作,所以那里没有任何东西存在。

有没有可能我有旧 lib 模块的预编译?如果是这样,我该如何冲洗它?

这是基于 MoarVM 2019.03 版构建的 Rakudo Star 2019.03.1 版 实施 Perl 6.d.

预编译模块存放在precomp目录中。您可以尝试重命名或删除 ~/.precomp 目录。

另请参阅此处

更新。好吧,我 认为 我已经复制了这个场景。它在一小时内可靠地显示了错误。但现在不是了。这很令人不安。调查仍在继续...


我已经复制了@p6steve 的场景,以防有人希望将此作为错误报告。目前我和@p6steve(根据下面的评论)在一起,因为我将把它当作一个 DIHWIDT 而不是一个可报告的错误。也就是说,现在我们有了一个高尔夫总结。

使用 path1 的原始主程序,然后是它直接使用的模块,然后是使用的模块:

use lib 'path1';
use lib1;
say $lib1::value;

unit module lib1;
use lib2;
our $value = $lib2::value;

unit module lib2;
our $value = 1;

这显示 1

如果将库复制到一个新目录,包括 .precomp 目录,然后编辑 lib2 但没有编辑 lib1,则忽略对 lib2 的更改。

Here it is on glot.io before and after copying the libs and their .precomp directory and then editing the libs.

原回答

感谢您编辑问题。这让我们所有人都可以继续前进。 :)

我想弄个水落石出,希望你也愿意试一试。这(n)个答案和下面的评论将记录我们的进步。

来自您对@ValleLukas 回答的评论:

Then I noticed ../lib2/.precomp directory - so realised library precomps are stored in the library folder. That did the job!

这是我对发生的事情的第一个猜测:

您将 lib 整体复制到 lib2。这复制了 precomp 目录。

您修改了 mymain.p6 中的 use lib ... 语句以引用 lib2

您的 mymain.p6 代码包含一个 use module-that-directly-or-indirectly-uses-mylibrary

你修改mylibrary.pm6.

但是什么都没有改变!为什么不呢?

您还没有触及 module-that-directly-or-indirectly-uses-mylibrary,因此 Rakudo 使用 lib2/.precomp 目录中该模块的预编译版本。

推测...

也许预编译版本存在的事实导致预编译逻辑假设如果它也找到了 module-that-directly-or-indirectly-uses-mylibrary 使用的模块的预编译版本那么它可以继续使用那个甚至不会打扰检查其时间戳与源版本的比较情况。

这符合您的场景吗?如果不是,是哪几位出错了?