交付有两个容易混淆的方向:素材包能否离开工作树解开后复跑,报表目标在故障后能否保持有效。前者由第 00 篇素材目录中的完整包承担,要求工具源码、隔离 Text::CSV、合成输入、金标、RUN.md、VERSIONS.md、证据和测试都进包,并在全新目录实跑 prove -r;第 37 篇的 MakeMaker distribution 则是另一份安装练习。两者不能互相替代。

正常写入路径下,report-file demo.tsv DEST 退出 0,STDOUT SAVED\n,目标是完整金标。反例用 invalid.tsv 重试:状态 2、STDOUT 空、STDERR line 1: invalid record\n,旧金标可再次打开核对。rename 失败时旧产物仍保留;但这些运行是在操作系统正常工作的场景。真断电后的目录项持久性和重启恢复 NOT_RUN,无文件与目录 fsync 协议就不能对硬件掉电给出保证。也没有真实云端安装、其他平台重试证据。

图:制品复跑与断电恢复的不同步骤

1
2
3
可复跑:发布包 -> 摘要核验 -> 解压 -> prove -> 输出与金标
可恢复:写出 -> 数据同步 -> 目录同步 -> 故障注入 -> 重启核验
后一条在本系列尚未实施,不能打勾

练习:把临时文件放在另一块挂载卷,再 rename 覆盖目标,能否照搬本机同目录原子替换结论?不能;跨设备 rename 不保证成功,需专门设计并测平台策略。已执行与 NOT_RUN 项分别记录在 examples/perl-language/evidence/E01-E08.md,参考 Perl 5.38.2 pod/perlfunc.pod 的 rename 及 pod/perlport.pod。

旧代码迁移的恢复边界也单独留证。course-legacy.pl 先跑全局路径、全局文件句柄和二参数 open 的 legacy 计数,再跑显式路径参数、词法文件句柄和三参数 open 的迁移版本;两者计数相同,TAP 还分别断言“隐式全局依赖被参数替代”“二参数 open 被三参数 open 替代”“全局文件句柄被词法文件句柄替代”。这只能证明小样本迁移前后行为一致,不证明任意旧脚本都可自动迁移。