Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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 Process - Fatal编程技术网

分发要包含在构建中的通用ant文件的好方法有哪些?

分发要包含在构建中的通用ant文件的好方法有哪些?,ant,build-process,Ant,Build Process,我在一个团队中工作,我们生产许多小应用程序,并使用ANT进行构建过程 我们希望以一种通用的方式容纳一些常用指令。目前,我们需要一个映射到公共位置的驱动器,并使用 <import file="${env.MAPPED_DRIVE}/common_directive.xml"> 必须有一种更好的方法来分发一个通用的ant文件,以包含在许多项目中,而不必映射驱动器。你还有其他建议吗 导入是一个“顶级”指令,这意味着它在目标内部无法工作。因此,我不能简单地创建一个下载文件然后导入的目标

我在一个团队中工作,我们生产许多小应用程序,并使用ANT进行构建过程

我们希望以一种通用的方式容纳一些常用指令。目前,我们需要一个映射到公共位置的驱动器,并使用

<import file="${env.MAPPED_DRIVE}/common_directive.xml">

必须有一种更好的方法来分发一个通用的ant文件,以包含在许多项目中,而不必映射驱动器。你还有其他建议吗

导入是一个“顶级”指令,这意味着它在目标内部无法工作。因此,我不能简单地创建一个下载文件然后导入的目标。

如果您在网站上使用并托管公共构建片段

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

如果你想要可重复的构建,你的URL引用是个坏主意,这让我想到了

<强>另一个要考虑的解决方案,如果您使用的是版本控制的VSN,则创建一个指向 然后,只需为ANT导入文件引用使用相对路径

有时构建一个 工作副本,由一个 不同签出的数量。用于 例如,您可能需要不同的 来自不同目录的子目录 存储库中的位置,或者 来自不同的存储库 总共你当然可以安排 使用
svn手动创建这样的场景
签出
以创建嵌套 正在尝试的工作副本结构 实现。但是如果这个布局是 对于使用您的 每个其他用户都需要 执行相同的签出 你做的手术

幸运的是,Subversion提供了 支持外部定义An externals定义是 本地目录到URL,理想情况下 版本化版本的特定修订 目录。在Subversion中,您声明 使用组中的外部定义
svn:externals
属性。你可以 使用创建或修改此属性 svn propset或svn propedit(参见 名为“”的节)。它可以设置在任何位置 版本目录及其值 描述外部存储库和 位置和客户端目录 该位置应位于哪个位置 退房了

svn:externals的便利性 属性是,一旦在 版本目录,所有 用它签出一份工作副本 目录还可以从 外部定义。换句话说, 一旦一个人做出努力 定义嵌套的工作副本 结构,其他人不必这样做 麻烦Subversion将在检查后 拿出原始工作副本, 也会自动签出 外部工作副本


我已经制定了一个解决方案,创建一个jar文件,其中包含目录中的可重用构建脚本,比如com/example/ant/sharedbuild,可以在ant 1.8中导入:

<project>
    <import>
        <javaresource name="com/example/ant/sharedbuild/java.xml">
            <classpath location="../../../../target/ant-shared-build.jar" />
        </javaresource>
    </import>
</project>

在我的例子中,这定义了项目的所有“公共”目标,以进行基于java的构建

语法有点冗长,尤其是当我添加越来越多的include文件时(比如说,添加创建osgijar的功能)。通过将包含宏定义和脚本定义组合的antlib.xml添加到jar文件(与共享构建脚本位于同一目录中),构建文件现在可以如下所示(现在还创建了一个OSGi jar包):


不幸的是,我不能在macrodef或scriptdef中共享代码,但实际上并不难:使用一点javascript来解析using属性并在每个属性上循环,从中派生一个文件名,然后导入

我在硬盘上的固定位置(相对于我的项目)引用jar文件。我认为我们可以做得更好。理想情况下,我希望从中心位置获取一个(版本化的!)jar文件。因为我们已经在使用Ivy(带有HTTP存储库),所以我们可以在那里发布jar文件(同样是一个版本),并直接从那里获取它:

<project xmlns:build="antlib:com.example.ant.sharedbuild">
    <property name="ant.shared.build.jar.file"
              location="${user.home}/ant/ant-shared-build-1.5.3.jar" />
    <get src="http://repo.example.com/.../ant-shared-build-1.5.3.jar"
         dest="${ant.shared.build.jar.file}"
         skipexisting="true" />
    <taskdef uri="antlib:com.example.ant.sharedbuild"
             classpath="${ant.shared.build.jar.file}" />
    <build:build using="java, jar, bundle" />
</project>

这方面存在一些问题:

  • 又开始啰嗦了
  • 对于每个build.xml,都会重复详细信息
  • 有很多重复的样板文件,尤其是版本号
  • 为了缓解这些问题,在每个包含build.xml的目录中,我还有一个bootstrap.xml(名称并不重要)。然后,每个build.xml包含以下文件:

    <project xmlns:build="antlib:com.example.ant.sharedbuild">
        <include file="bootstrap.xml" />
        <build:build using="java, jar, bundle" />
    </project>
    
    
    
    每个bootstrap.xml至少包括其父级的bootstrap.xml:

    <project>
        <include file="../bootstrap.xml" />
    </project>
    
    
    
    顶层bootstrap.xml(根目录),然后执行获取jar文件和创建自定义任务的工作,如上所述:

    <project>
        <property name="ant.shared.build.version"
                  value="1.5.3" />
        <property name="ant.shared.build.jar.filename"
                  value="ant-shared-build-${ant.shared.build.version}.jar" />
        <property name="ant.shared.build.jar.file"
                  location="${user.home}/ant/${ant.shared.build.jar.filename}" />
        <get src="http://repo.example.com/.../${ant.shared.build.jar.filename}"
             dest="${ant.shared.build.jar.file}"
             skipexisting="true" />
        <taskdef uri="antlib:com.example.ant.sharedbuild"
                 classpath="${ant.shared.build.jar.file}" />
    </project>
    
    
    
    虽然与这个问题没有直接关系,但我实际上正在将macrodef和scriptdef修改为一个自定义ant任务,因为我希望能够支持如下语法:

    <project xmlns:build="antlib:com.example.ant.sharedbuild">
        <include file="bootstrap.xml" />
        <build:build>
            <using>
                <java />
                <bundle>
                    <manifest>
                        Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
                        Bundle-Activator: com.example.time.impl.Activator
                    </manifest>
                </bundle>
            </using>
        </build:build>
    </project>
    
    
    导入包:*,org.joda.time;version=“[1.6.0,1.6.0]”
    捆绑激活器:com.example.time.impl.Activator
    
    我应该指出,仅仅创建一个可再发行的构建并不意味着它会有用。您仍然需要投入时间和精力来创建符合des的内聚、模块化、一致的实现
    <project xmlns:build="antlib:com.example.ant.sharedbuild">
        <include file="bootstrap.xml" />
        <build:build>
            <using>
                <java />
                <bundle>
                    <manifest>
                        Import-Package: *,org.joda.time;version="[1.6.0,1.6.0]"
                        Bundle-Activator: com.example.time.impl.Activator
                    </manifest>
                </bundle>
            </using>
        </build:build>
    </project>