我有一个基于控制台的构建系统,它使用 Ant 和 Ivy ,并且希望避免使用 Maven 。我使用 Ivy 获取项目的外部依赖项。我的问题是如何最好地处理我的内部项目依赖项。即我构建了许多我的模块所基于的库文件(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检查我的源代码并从控制台构建所有内容,而无需配置任何其他类型的Ivy存储库信息,我想保留该属性。
答案 0 :(得分:1)
常春藤支持documentation中描述的不同类型或存储库。
如果没有自定义,它们位于“〜/ .ivy2”目录下。因此,我建议将每个构建配置为发布到本地存储库,并像往常一样简单地引用依赖项。您需要做的就是确保在新机器上构建顺序正确,以便以正确的顺序填充本地存储库(请参阅buildlist任务)。
使用本地仓库与引用已知相对位置的罐子没有太大区别。它确实有利于使每个项目与另一个项目分离。
├── build.xml
└── ivy.xml
Project将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
<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-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>