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

时间:2019-08-12 18:44:19

标签: raku pre-compilation

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

所以我继续将mymain.p6标头从use lib '../lib';更改为use lib '../lib2';。然后,我删除../lib2/mylibrary.pm6中的几行代码,并确保:w正在执行我期望的操作。

想象一下,尽管我的程序虽然被删除了很多,但仍然可以完美运行,但让我感到惊讶。当我rm -R / lib时它甚至可以工作,所以那里的任何东西都不会持久。

我是否有机会随身携带旧版lib模块的precomp?如果是这样,我该如何冲洗它?

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

2 个答案:

答案 0 :(得分:6)

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

另请参见此SO question

答案 1 :(得分:3)

更新。好吧,我想法我复制了该场景。它在一小时内可靠地显示了该错误。但是现在不是。真令人不安。调查仍在继续...


我已经复制了@ 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

如果将这些libs复制到一个新的目录(包括.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答案的评论:

  

然后,我注意到../lib2/.precomp目录-因此,已实现的库precomps存储在库文件夹中。做到了!

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

您将lib批量复制到lib2。这样就复制了precomp目录。

您已将use lib ...中的mymain.p6语句修改为引用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使用的模块的预编译版本,则可以继续使用该版本,而不必费心检查其时间戳与源版本相比如何。

这符合您的情况吗?如果没有,那是哪位错了?