_由:mfikes_ 评论
注意,所附补丁进行了一处调整,略有超出工单的范围:在 {{:provides}} 是隐式的情况下(因为 {{:file}} 代表一个目录),并且指定了 {{:global-exports}},之前的代码会将整个全局导出映射复制到生成的每个外部库规范中。这次修改只复制与相关文件相关的子映射。虽然当生成扩展时这似乎是正确的做法,但在新的验证逻辑中这也是必要的:没有这个更改,任何意外复制的非相关全局导出会导致验证逻辑得出提供缺失的结论。
例如
{:file "libs"
:global-exports {foo foo-g bar bar-g}}
将被展开为几个库规范,一个对应 "libs" 中找到的每个文件,根据先前的实现,每个都会复制整个映射。修正后的代码只复制子映射
:global-exports {foo foo-g}
到与 {{:file "libs/foo.js"}} 相关的规范中。
验证信息示例
显式情况
java.lang.Exception: 外部库全局导出未提供:["missing-lib" "another-lib"] 没有在 {:file "libs/mylib.js", :provides ["my-lib"], :global-exports {my-lib mylib, missing-lib missing, another-lib another}} 中的 :provides 找到
...
显式情况,带有命名空间
java.lang.Exception: 外部库全局导出未提供:["missing-lib" "another-ns/another-lib"] 没有在 {:file "libs/mylib.js", :provides ["some-ns/my-lib"], :global-exports {some-ns/my-lib mylib, missing-lib missing, another-ns/another-lib another}} 中的 :provides 找到
...
隐式(目录)情况中只有 libs/other.js 存在
java.lang.Exception: 外部库未显式提供全局导出。对于库规范 {:file "libs", :global-exports {other other-g, missing missing-g, another another-g}},找不到文件 ["libs/missing.js" "libs/another.js"]
...