我正在尝试重构一些代码。我的方法(使用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。
答案 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的更改。
感谢您编辑问题。这给了我们更多的继续。 :)
我想尝试深入了解它,并希望您也愿意尝试。下面的(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
使用的模块的预编译版本,则可以继续使用该版本,而不必费心检查其时间戳与源版本相比如何。
这符合您的情况吗?如果没有,那是哪位错了?