Dependencies Ivy:将所有依赖项安装到共享存储库

Dependencies Ivy:将所有依赖项安装到共享存储库,dependencies,repository,installation,shared,ivy,Dependencies,Repository,Installation,Shared,Ivy,正如标题所说,这主要是我们用于Java项目依赖项解析的内容。我们刚刚建立了常春藤,所以我可能不知道一切 这是我的问题:假设我有一个依赖于B,C,D,E等等的模块a。我知道我可以轻松地将模块发布到共享回购。这很有效。我想要的是,Ivy将模块A所依赖的所有模块从其公共存储库复制到外部共享存储库。我已经检查了ivy:install任务,这不是我想要的(或者我可能误解了它的工作原理)。报告说: 这将暂时将所有依赖项(甚至不包括依赖模块本身)安装到我的共享存储库中,这样我们就可以在没有internet连接

正如标题所说,这主要是我们用于Java项目依赖项解析的内容。我们刚刚建立了常春藤,所以我可能不知道一切

这是我的问题:假设我有一个依赖于B,C,D,E等等的模块a。我知道我可以轻松地将模块发布到共享回购。这很有效。我想要的是,Ivy将模块A所依赖的所有模块从其公共存储库复制到外部共享存储库。我已经检查了
ivy:install
任务,这不是我想要的(或者我可能误解了它的工作原理)。报告说:


这将暂时将所有依赖项(甚至不包括依赖模块本身)安装到我的共享存储库中,这样我们就可以在没有internet连接或公共存储库关闭的情况下进行构建。

这不是最佳解决方案,但使用两个存储库可能有效

使用第一个存储库发布模块A,然后使用ivy将A及其所有依赖项复制到第二个存储库。为此,您可以使用
安装任务。在
from
属性中,您将给出一个指向第一个存储库和公共存储库的属性,在
to
属性中,您将给出您的共享存储库

<target name="install" depends="publish-local">
    <ivy:install module="${ivy.module}" from="local" to="shared" organisation="${ivy.organisation}" revision="${ivy.revision}" overwrite="true" transitive="true"/>
</target>

我没有在这样的设置中使用Ivy,但我们成功地使用
install
将工件(包括其所有可传递的依赖项)从公共存储库复制到我们自己的存储库,所以我不明白为什么这样做不起作用。

这是基于Philipp的回答和我不可读的评论。我只是想举几个例子。我总是在每个项目中包含一个公共的
build ivy.xml
。此通用构建脚本包含以下任务,这些任务是安装模块(包括共享存储库的依赖项)所必需的

<target name="install" depends="publish-local">
    <ivy:install module="${ivy.module}" from="local" to="shared" organisation="${ivy.organisation}" revision="${ivy.revision}" overwrite="true" transitive="true"/>
</target>
这将读取ivy.xml以填充变量

<target name="init">
    <ivy:settings file="${env.IVY_SETTINGS}/ivysettings.xml"/>
    <ivy:info/>
</target>

下一个任务取决于需要自己实现的清理、编译、打包等各种任务

<target depends="init,clean-build,clean-dist,dist,package-doc,package-sources" name="publish-local">
    <ivy:resolve/>
    <ivy:publish status="release" resolver="local" overwrite="true" >
        <artifacts pattern="${dist.dir}/[artifact]-[revision](-[classifier]).[ext]"/>
    </ivy:publish>
</target>

此任务现在将当前模块(包括依赖项)以传递方式安装到共享存储库中

<target name="install" depends="publish-local">
    <ivy:install module="${ivy.module}" from="local" to="shared" organisation="${ivy.organisation}" revision="${ivy.revision}" overwrite="true" transitive="true"/>
</target>


这是一种丑陋的黑客行为,但确实有效!我已经有一个ant任务
publishlocal
,它完成了
。然后,我添加了一个新任务
install
,该任务名为
,它依赖于
publish local
init
,后者设置一些环境变量并调用
,您需要解决的基本问题是什么?maven代理可能就足够了。我们目前正从主要由NetBeans/IDE驱动的开发过渡到允许持续集成的自动化ANT/ivy驱动的方法。我们需要解决的问题或我们正在努力实现的是独立于公共存储库和我们的互联网连接。库和整个存储库可能无法长期使用。因此,一旦发布的版本可用,所有依赖项都必须从我们的内部共享回购中可用。我发现,如果你完全使用maven,这样的东西很容易获得,但随后你会受到很多其他限制。为什么选择ant+ivy?我们也评估了Maven。但我们选择常春藤是因为它很简单。对于我们“移植”到ANT/Ivy的大多数项目,它就像魔术一样工作。然而,对于更复杂的部署设置,使用配置是非常强大的。也许将来我们会后悔,因为我们遇到了一些用常春藤无法解决的问题。但现在,它的性能相当好。听起来上游代理就足够了。下载的任何工件都将缓存在代理中