Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在项目之间最好地共享Ant目标?_Ant_Build_Build Process_Ivy_Dependency Management - Fatal编程技术网

如何在项目之间最好地共享Ant目标?

如何在项目之间最好地共享Ant目标?,ant,build,build-process,ivy,dependency-management,Ant,Build,Build Process,Ivy,Dependency Management,是否有一种成熟的方式在项目之间共享目标?我目前有一个解决方案,但有点不雅观。以下是我目前正在做的事情 我有一个名为ivy tasks.xml的文件,托管在我们网络的服务器上。除其他目标外,该文件还包含用于管理项目依赖关系的样板任务。例如: <project name="ant-ivy-tasks" default="init-ivy" xmlns:ivy="antlib:org.apache.ivy.ant"> ... <target name="iv

是否有一种成熟的方式在项目之间共享目标?我目前有一个解决方案,但有点不雅观。以下是我目前正在做的事情

我有一个名为
ivy tasks.xml
的文件,托管在我们网络的服务器上。除其他目标外,该文件还包含用于管理项目依赖关系的样板任务。例如:

<project name="ant-ivy-tasks" default="init-ivy"
         xmlns:ivy="antlib:org.apache.ivy.ant">
  ...
  <target name="ivy-download" unless="skip.ivy.download">
    <mkdir dir="${ivy.jar.dir}"/>
    <echo message="Installing ivy..."/>
    <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
         dest="${ivy.jar.file}" usetimestamp="true"/>
  </target>

  <target name="ivy-init" depends="ivy-download"
          description="-> Defines ivy tasks and loads global settings">
    <path id="ivy.lib.path">
      <fileset dir="${ivy.jar.dir}" includes="*.jar"/>
    </path>
    <taskdef resource="org/apache/ivy/ant/antlib.xml"
             uri="antlib:org.apache.ivy.ant"
             classpathref="ivy.lib.path"/>
    <ivy:settings url="http://myserver/ivy/settings/ivysettings-user.xml"/>
  </target>
  ...
</project>

...
...
此文件承载的原因是因为我不想:

  • 将文件签入每个需要它的项目-这将导致重复,使维护目标更加困难
  • 让我的build.xml依赖于从源代码管理签出一个项目——这将使构建在顶层有更多的xml来访问文件
在我的项目的build.xmls中,我对该文件的处理大致如下:

<property name="download.dir" location="download"/>
<mkdir dir="${download.dir}"/>
<echo message="Downloading import files to ${download.dir}"/>

<get src="http://myserver/ivy/ivy-tasks.xml" dest="${download.dir}/ivy-tasks.xml" usetimestamp="true"/>
<import file="${download.dir}/ivy-tasks.xml"/>

关于这一点的“肮脏”部分是,我必须在目标之外执行上述步骤,因为目标必须是顶级的。另外,我还必须在所有需要它的build.XML文件中包含这个XML(即,仍然有一些重复)

除此之外,可能还有其他情况,我可能需要导入一些常见的(非常春藤)任务。如果我使用Ivy的依赖关系管理来提供这些任务,我仍然会遇到问题,因为在我解决依赖关系时,我必须在build.xml中的目标内,并且无法导入(由于上面提到的约束)


是否有更好的解决方案来实现我的目标?

在进行一些额外的搜索之后,一个可能的解决方案是使用build.xml检查特定的必需文件


但是,这只适用于使用Subversion作为源代码管理的用户。对于不使用Subversion的用户,如果有一个与SCM无关的解决方案,或者另一个支持类似功能的SCM,那就更好了。

如果使用,您可以将它们全部打包到一个JAR文件中。然后只需将此文件复制到
${ANT_HOME}/lib
目录中即可使用它们。

我们所做的是创建一个名为“bootstrap”的项目,其中包含办公室其他项目所需的各种xml文件。 因此,要设置开发环境,请在引导中运行build.xml,将xml文件(如ivy文件和其他目标文件)复制到已知位置,然后构建文件包括以下内容:

<import file="${ant.bootstrap.dir}/ant-commons.xml" />
<import file="${ant.bootstrap.dir}/ant-commons-ear.xml" />

我们的bootstrap build.xml包含以下内容:

<target name="install">
        <fail unless="ant.bootstrap.dir" message="ant.bootstrap.dir ${missing.property.message}"/>
        <copy todir = "${ant.bootstrap.dir}">
            <fileset dir = "src/xml"/>
        </copy>
</target>

如果您使用的是ANT 1.8+,那么您可以直接从托管位置导入build.xml

由于Ant 1.8.0,该任务还可以 从URL或URL导入资源 类路径资源(URL、, 真的)。如果你需要知道 当前生成文件的源已被删除 您可以查阅文件或URL 属性ant.file.type.projectname (使用与上述相同的示例) ant.file.type.builddocs)中 具有值“file”或“url”



我也遇到了同样的困难。我只是做了大量的复制和粘贴:)。这对本地文件非常有效,但是当我尝试使用URL时,它仍然尝试相对于本地项目的路径解析URL。要避免相对于本地项目的路径解析URL,请使用
<!-- importing.xml -->
<project name="importing" basedir="." default="...">
  <import file="http://myserver/ivy/ivy-tasks.xml"/>
</project>