锡兰复制工具

The ceylon copy tool

我正在使用 Ceylon 1.2.3 版本的 Ceylon 复制命令来下载依赖项:

./bin/ceylon copy --rep  "http://repo.maven.apache.org/maven2/" -out outdir "joda-time:joda-time/2.9.4"

为什么工具会跳过下载呢?

Module joda-time:joda-time/2.9.4 [1/1]) Skipped.

该工具看起来 - 除其他外 - 适用于:

http://repo.maven.apache.org/maven2//joda-time:joda-time/2.9.4/joda-time:joda-time-2.9.4.jar 

...但它应该查找:

http://repo.maven.apache.org/maven2/joda-time/joda-time/2.9.4/joda-time-2.9.4.jar

从逻辑上讲,以下应该有效:

./bin/ceylon copy --rep  "http://repo.maven.apache.org/maven2/" --out here --verbose --jvm "joda-time/2.9.4"

...但它告诉我:

... Module joda-time/2.9.4 not found ...

...类似于:

./bin/ceylon copy --rep  "http://repo.maven.apache.org/maven2/" --out here --verbose --jvm "joda-time-2.9.4.jar"

...以及:

./bin/ceylon copy --rep  "http://repo.maven.apache.org/maven2/" --out here --verbose --jvm "joda-time-2.9.4"

如何让复制工具正确构建 url 并将模块下载到我的本地存储库?

名称中带有 : 的模块在 Ceylon 1.2.2+ 中被解析为 Maven 模块,因此 --rep "http://repo.maven.apache.org/maven2/" 是多余的。

然而,它在 1.2.2 中并没有真正起作用,因为生成的存储库包含 outdir/joda-time:joda-time/2.9.4/joda-time:joda-time-2.9.4.jar,这是 never 将由 Ceylon 解析(因为名称包含一个 : 它只会尝试从 Maven 存储库而不是 Ceylon 存储库解析它)。所以这是一个错误。

此外,它没有下载依赖项或具体化 module.xml 来描述它们,所以这是另一个错误。

现在,如果你在 Ceylon 1.2.3 (git master) 中尝试它,它会说 Skipped 而它 可能 是由于这个事实我们已经为 Maven 导入添加了 namespaces,因此语法可以是 maven:joda-time:joda-time/2.9.4(它确实在 flux ATM 中)。除非你尝试你会得到一个异常,所以这是第三个错误。

你能举报他们吗? https://github.com/ceylon/ceylon/issues/new

真正正确的答案是复制工具不是用来复制 Maven 模块的。

复制工具的整个想法是你有一个已经编译的模块,可能有依赖项,你想将它复制到其他存储库以便能够 运行 它在那里。根据您的用例,您可能希望在复制或不复制时包含它的依赖项。

在这种情况下,复制 Maven 模块没有太大意义,因为 a) 它们会以某种方式从 Maven 模块转换为 Ceylon 模块(这并不总是一个微不足道的过程,这就是为什么我们有一个特殊的工具 ceylon import-jar 来帮助您做到这一点)。 b) 同时,您的导入代码仍会引用 Maven 导入,这意味着即使复制工具复制了那些 Maven 模块,您的原始模块仍会使用 Maven 存储库中的模块!您必须更改导入并重新编译代码才能使其正常工作。

所以你遇到的bug是Ceylon 1.2.2竟然在尝试这样做。我刚刚对 1.2.3 复制工具进行了更改,它将始终跳过任何不是来自 Ceylon 存储库的模块。它的文档已更新以明确这一点。

感谢您提醒我们注意此事!