遗留存储库的 Ivy 依赖项管理
Posted
技术标签:
【中文标题】遗留存储库的 Ivy 依赖项管理【英文标题】:Ivy dependency management for legacy repository 【发布时间】:2013-10-11 13:13:59 【问题描述】:我们有一个没有 ivy.xml 和其他元数据文件的存储库。因为,它由另一个不使用 ivy/maven 的团队发布,但将继续频繁地交付代码。
依赖所需的 jars 以平面结构存储在单个目录中,没有修订数据。组织/模块/修订结构不存在。
ivy 是否允许在核心产品中解决此类依赖关系,还是我必须编写自定义解析器?
谢谢
【问题讨论】:
【参考方案1】:标准解析器应该能够获取 atifacts(url、filesystem 等)。您将面临的问题是,在默认情况下,ivy 假定修订版永远不会更改。如果没有版本信息,您将需要调整标准解析器设置以强制 ivy 始终检查工件。
ivy concepts 页面解释了其工作原理:
有些人,尤其是那些来自 maven 2 的人,喜欢使用一个特殊的修订版来处理经常更新的模块。在 maven 2 中,这被称为 SNAPSHOT 版本,有人认为它有助于节省磁盘空间,只保留一个版本以供您在开发时进行大量中间构建。
Ivy 以“更改版本”的概念支持这种方法。一个不断变化的修订版就是这样:Ivy 应该考虑到工件可能会随着时间而改变的修订版。为了处理这个问题,你可以在依赖标签上指定一个依赖改变,或者在你的解析器上使用 changedPattern 和 changedMatcher 属性来指示哪个修订或修订组应该被视为改变。
我个人不喜欢这种依赖管理。您的构建是一个移动的目标柱,很难保持稳定。
我鼓励说服其他团队在他们发布的每个工件上至少附加一个内部版本号。然后,您的 ivy 构建可以使用动态修订来解决工件。关键是,当您发布代码时,您的模块将依赖于其特定版本的 3rd 方库。
更新
以下是一个示例项目。它使用 Maven Central 和本地存储库来下载其依赖项。
├── build
│ ├── compile
│ │ ├── artifact1.jar <-- Changing artifact
│ │ └── slf4j-api.jar
│ ├── runtime
│ │ ├── artifact1.jar <-- Changing artifact
│ │ ├── artifact2.jar <-- Changing artifact
│ │ ├── log4j.jar
│ │ ├── slf4j-api.jar
│ │ └── slf4j-log4j12.jar
│ └── test
│ ├── artifact1.jar <-- Changing artifact
│ ├── artifact2.jar <-- Changing artifact
│ ├── artifact3.jar <-- Changing artifact
│ ├── hamcrest-core.jar
│ ├── junit.jar
│ ├── log4j.jar
│ ├── slf4j-api.jar
│ └── slf4j-log4j12.jar
├── build.xml
├── ivysettings.xml
└── ivy.xml
本地 repo 没有版本控制并且没有 ivy 文件。通常常春藤解析器需要常春藤文件(或 Maven 的 POM)来确定远程模块是否已更改。在没有元数据的情况下,您可以在 ivy 文件中将依赖项标记为更改。
build.xml
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="build" description="do something">
<ivy:retrieve pattern="build/[conf]/[artifact].[ext]"/>
</target>
<target name="clean" description="Cleanup build files">
<delete dir="build"/>
</target>
<target name="clean-all" depends="clean" description="Additionally purge ivy cache">
<ivy:cleancache/>
</target>
</project>
注意事项:
使用 ivy 构建文件。检索任务将文件组合到它们的各种配置分组中。ivy.xml
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
<dependency org="myorg" name="artifact1" rev="NA" conf="compile->default" changing="true"/>
<!-- runtime dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.5" conf="runtime->default"/>
<dependency org="myorg" name="artifact2" rev="NA" conf="runtime->default" changing="true"/>
<!-- test dependencies -->
<dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
<dependency org="myorg" name="artifact3" rev="NA" conf="test->default" changing="true"/>
</dependencies>
</ivy-module>
注意事项:
“myorg”依赖项有一个虚拟“NA”条目作为其修订版,并标记为“正在更改”。ivysettings.xml
<ivysettings>
<settings defaultResolver="central" />
<resolvers>
<ibiblio name="central" m2compatible="true"/>
<url name="myorg-repo">
<artifact pattern="http://localhost:8080/userContent/[artifact].[ext]"/>
</url>
</resolvers>
<modules>
<module organisation="myorg" resolver="myorg-repo"/>
</modules>
</ivysettings>
注意事项:
“myorg-repo”解析器设置为仅下载“myorg”依赖项。这使得所有其他依赖项都可以由 Maven Central 解决。 “myorg-repo”解析器只是声明了一个工件模式,我假设没有要检索的 ivy 文件。【讨论】:
@mark-oconnor 感谢 Mark,ivy 规定不使用 (-[revision]) 进行修订。我的问题是我什至在存储库中都没有常春藤文件。结构就像repo.com/library 这个目录将包含不同模块的所有jar。只是罐子,没有元数据 @Akshat Ivy 可以做到这一点,但是如果没有元数据,您必须将依赖项标记为“正在更改”(解析器通常会尝试通过查看元数据来确定正在更改的远程模块)。我提供了一个详细的例子【参考方案2】:了解常春藤模式帮助我解决了这个问题。只要存储库没有 ivy 文件,就永远不会指定 ivy 模式。
【讨论】:
以上是关于遗留存储库的 Ivy 依赖项管理的主要内容,如果未能解决你的问题,请参考以下文章