我有一个基于控制台的构建系统,该系统使用 Ant 和 Ivy,并且希望避免使用 Maven。我使用 Ivy 获取项目的外部依赖项。我的问题是如何最好地处理我的内部项目依赖项。 IE。我构建了许多库文件(JAR),我的模块基于这些文件,并且不太可能在其他上下文中使用。因此,这些内部项目依赖项只是由build.xml
文件捕获,通过相对路径直接标识所需 JAR 的位置(因为所有内容都位于存储库中的同一源代码树下) 。例如。我有像这样的Ant“代码”:
<path id = "compile.classpath">
<fileset dir="${internal-project-dependency-a.dir}">
<include name ="*.jar"/>
</fileset>
<fileset dir="${internal-project-dependency-b.dir}">
<include name ="*.jar"/>
</fileset>
<fileset dir="${internal-project-dependency-c.dir}">
<include name ="*.jar"/>
</fileset>
</path>
我的问题是:上述方法是否可以接受(从最佳实践的角度来看),或者我应该将我的内部项目依赖项打包并发布到一些轻量级的“仅限本地”Ivy 存储库中(如果有这样的事情) )?我设置系统的方式是,任何使用 Ivy 和 Ant 的人都可以从 github check out 我的源代码,并从控制台构建所有内容,而无需配置任何其他类型的 Ivy 存储库信息,我想保留该属性。
最佳答案
Ivy 支持不同种类或存储库,如 documentation 中所述。 .
- 本地
- 已分享
- 公开
如果没有自定义,它们位于您的“~/.ivy2”目录下。因此,我建议配置每个构建以发布到本地存储库,并像平常一样简单地引用依赖项。您需要做的就是确保在新机器上构建顺序正确,以便以正确的顺序填充本地存储库(请参阅 buildlist 任务)。
使用本地存储库与引用已知相对位置中的 jar 没有太大区别。它确实具有使每个项目彼此解耦的好处。
示例
├── build.xml
└── ivy.xml
项目将 3 个文件发布到本地存储库:
$ find ~/.ivy2/local -type f
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml
/home/mark/.ivy2/local/myorg/hello/1.0/ivys/ivy.xml.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt.sha1
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/English.txt
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Spanish.txt
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt.md5
/home/mark/.ivy2/local/myorg/hello/1.0/docs/Irish.txt
build.xml
<project name="demo" default="publish" xmlns:ivy="antlib:org.apache.ivy.ant">
<target name="init">
<ivy:resolve/>
</target>
<target name="build" depends="init">
<mkdir dir="build"/>
<echo file="build/English.txt">Hello world</echo>
<echo file="build/Irish.txt">Dia dhuit</echo>
<echo file="build/Spanish.txt">Hola mundo</echo>
</target>
<target name="publish" depends="clean,build">
<ivy:publish pubrevision="1.0" status="release" resolver="local" >
<artifacts pattern="build/[artifact].[ext]"/>
</ivy:publish>
</target>
<target name="clean" description="Cleanup build files">
<delete dir="build"/>
</target>
</project>
ivy.xml
<ivy-module version="2.0">
<info organisation="myorg" module="hello"/>
<publications>
<artifact name="English" ext="txt" type="doc"/>
<artifact name="Irish" ext="txt" type="doc"/>
<artifact name="Spanish" ext="txt" type="doc"/>
</publications>
</ivy-module>
关于java - 项目间依赖关系的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24204953/