锡兰复制工具
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 中)。除非你尝试你会得到一个异常,所以这是第三个错误。
真正正确的答案是复制工具不是用来复制 Maven 模块的。
复制工具的整个想法是你有一个已经编译的模块,可能有依赖项,你想将它复制到其他存储库以便能够 运行 它在那里。根据您的用例,您可能希望在复制或不复制时包含它的依赖项。
在这种情况下,复制 Maven 模块没有太大意义,因为 a) 它们会以某种方式从 Maven 模块转换为 Ceylon 模块(这并不总是一个微不足道的过程,这就是为什么我们有一个特殊的工具 ceylon import-jar
来帮助您做到这一点)。 b) 同时,您的导入代码仍会引用 Maven 导入,这意味着即使复制工具复制了那些 Maven 模块,您的原始模块仍会使用 Maven 存储库中的模块!您必须更改导入并重新编译代码才能使其正常工作。
所以你遇到的bug是Ceylon 1.2.2竟然在尝试这样做。我刚刚对 1.2.3 复制工具进行了更改,它将始终跳过任何不是来自 Ceylon 存储库的模块。它的文档已更新以明确这一点。
感谢您提醒我们注意此事!
我正在使用 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 中)。除非你尝试你会得到一个异常,所以这是第三个错误。
真正正确的答案是复制工具不是用来复制 Maven 模块的。
复制工具的整个想法是你有一个已经编译的模块,可能有依赖项,你想将它复制到其他存储库以便能够 运行 它在那里。根据您的用例,您可能希望在复制或不复制时包含它的依赖项。
在这种情况下,复制 Maven 模块没有太大意义,因为 a) 它们会以某种方式从 Maven 模块转换为 Ceylon 模块(这并不总是一个微不足道的过程,这就是为什么我们有一个特殊的工具 ceylon import-jar
来帮助您做到这一点)。 b) 同时,您的导入代码仍会引用 Maven 导入,这意味着即使复制工具复制了那些 Maven 模块,您的原始模块仍会使用 Maven 存储库中的模块!您必须更改导入并重新编译代码才能使其正常工作。
所以你遇到的bug是Ceylon 1.2.2竟然在尝试这样做。我刚刚对 1.2.3 复制工具进行了更改,它将始终跳过任何不是来自 Ceylon 存储库的模块。它的文档已更新以明确这一点。
感谢您提醒我们注意此事!