我们有一个没有 ivy.xml 和其他元数据文件的存储库。因为,它由另一个不使用 ivy/maven 的团队发布,但将继续频繁地交付代码。
依赖所需的 jars 以平面结构存储在单个目录中,没有修订数据。组织/模块/修订结构不存在。
ivy 是否允许在核心产品中进行此类依赖解析,还是我必须编写自定义解析器?
谢谢
我们有一个没有 ivy.xml 和其他元数据文件的存储库。因为,它由另一个不使用 ivy/maven 的团队发布,但将继续频繁地交付代码。
依赖所需的 jars 以平面结构存储在单个目录中,没有修订数据。组织/模块/修订结构不存在。
ivy 是否允许在核心产品中进行此类依赖解析,还是我必须编写自定义解析器?
谢谢
标准解析器应该能够获取 atifacts(url、filesystem等)。您将面临的问题是,在默认情况下,ivy 假定修订版永远不会更改。如果没有版本信息,您将需要调整标准解析器设置以强制 ivy 始终检查工件。
常春藤概念页面解释了这是如何工作的:
有些人,尤其是那些来自 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 文件中将依赖项标记为更改。
<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-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>
笔记:
<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>
笔记:
了解常春藤模式帮助我解决了这个问题。只要存储库没有常春藤文件,就永远不会指定常春藤模式。