我正在尝试重构一些代码。我的方法(使用 vi(是将我的旧库从/lib 复制到/lib2。这样我就可以破解大部分,但仍然有一个框架来重构。
所以我继续将mymain.p6标题从use lib '../lib';
更改为use lib '../lib2';
。然后我删除了../lib2/mylibrary.pm6
中的一大块行,并确保 :w 正在做我期望的事情。
想象一下,当我的程序尽管已被大量删除,但仍然完美运行时,我会感到惊讶。当我 rm -R/lib 时它甚至可以工作,所以那里没有任何东西持续存在。
我是否有可能有一个旧库模块的预编译?如果是这样,我该如何冲洗它?
这是基于MoarVM版本2019.03构建的Rakudo Star版本2019.03 实现 Perl 6.d。
预编译模块存储在预编译目录中。您可以尝试重命名或删除~/.precomp
目录。
另请参阅此处
的SO问题。更新。好吧,我以为我已经复制了这个场景。它在一小时内可靠地显示了该错误。但现在不是了。这很令人不安。调查仍在继续...
我已经复制了@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 的更改。
这是在复制库及其 .precomp 目录然后编辑库之前和之后的 glot.io 上。
原答案
感谢您编辑您的问题。这使我们大家有更多的工作要做。:)
我想尝试深入了解它,希望你也愿意尝试一下。这个(n(答案和下面的评论将记录我们的进度。
从你对@ValleLukas答案的评论中:
然后我注意到../lib2/.precomp 目录 - 因此实现的库预编译存储在库文件夹中。那完成了工作!
这是我对发生的事情的第一个猜测:
您lib
集体复制到lib2
.这将复制预编译目录。
您在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
使用的模块的预编译版本,那么它可以继续使用它,甚至懒得检查其时间戳与源版本的比较。
这是否符合你的方案?如果不是,它出错了哪些位?