ANT脚本移动指定的文件

时间:2012-08-17 13:56:35

标签: ant salesforce

我正在尝试编写一个简单的ANT脚本,将文件/文件夹复制到指定的目录。例如,通过运行:

ant deploy src/classes/myClass.class

文件“myClass.class”从“src / classes /”复制到“deploy / src / classes /”。此外,这应该适用于指定的文件夹,因此运行:

ant deploy src/classes/

应该将所有文件从src / classes复制到“deploy / src / classes”。此外,目标文件夹在脚本运行之前不会存在,因此需要先“触摸”......

从四处查看复制文件并不是一个问题,但我无法弄清楚如何使用参数(如上所述)......

有谁知道如何激活它?

4 个答案:

答案 0 :(得分:1)

Ant不是一种计算机语言。它是一种矩阵依赖语言。

差异很微妙:编程语言更灵活,但你必须告诉它每一步都要采取。矩阵依赖语言指出了执行的顺序。

这可能是一个微妙但重要的区别。在标准的Ant中,基本的控制结构如while循环,for循环和if / then语句都缺失。

听起来,使用标准计算机语言,您想要做的事情会更容易。也许是Python,Perl,甚至是shell脚本。

在命令行中键入“ant -help”,您将看到没有像使用常规编程语言那样将参数传递到Ant的真正方法。相反,您可以在Ant可以使用的命令行上设置属性

$ant -Ddeploy.classfile=src/classes/myClass.class deploy

-D允许您在调用 deploy 任务时设置属性。然后,您可以使用 deploy.classfile 属性在 目标中的Ant 任务中使用它。我粗略估计,即使这样一个简单的 build.xml 文件也需要大约20到30行。尤其如此,您将为其提供类文件或目录,并且您必须以不同方式处理它们,这需要第二个目标。不仅如此,还很难理解工作流程。

以下是一个想法,为什么不在destdir任务中使用<javac>目标来首先在*.class目录中创建所需的deploy文件。 Ant的主要做法之一是将您构建的文件与存储库中的文件分开。它使清理更容易,更容易。另外,<javac>任务知道不为未更改的源文件重建类文件。

<target name="compile"
    description="Compile your source files">

    <property name="main.destdir" value="${basedir}/deploy/classes"/>
    <property name="main.srcdir" value="${basedir}/src"/>

    <path id="main.classpath">
        <fileset dir="${basedir}/lib/>
    </path>

    <javac srcdir="${main.srcdir}"
        destdir="${main.destdir}"
        classpathref="main.classpath"/>
</target>

现在,您不必将文件从源目录复制到deploy目录。更好的是,<javac>不会重新编译未更改的源文件。让Ant完成它为其设计的工作,并使用一种优秀的脚本语言。

答案 1 :(得分:1)

如果您在更改输入命令行字符串时没有问题,可以使用以下内容。

<?xml version="1.0" encoding="UTF-8" ?>
<project name="Deploy" default="copy">

    <!--
        This script is called in the following manner:

        ant deploy -Dsource.dir=src/classes     (to copy the entire directory)
        ant deploy -Dsource.dir=src/classes -Dsource.module=myClass.class
                                                (to copy one class)

    -->

    <!-- <property name="source.dir" value="src/com/ggl/unzip" />  -->
    <!-- <property name="source.module" value="myClass.class" />  -->

    <target name="copy">
        <condition property="source.module.text" value="all files">
            <not>
                <isset property="source.module" />
            </not>
        </condition>

        <condition property="source.module" value="**.*">
            <not>
                <isset property="source.module" />
            </not>
        </condition>

        <property name="source.module.text" value="${source.module}" />

        <echo>Copying ${source.module.text} from ${source.dir} to deploy/${source.dir}</echo>

        <copy todir="deploy/${source.dir}" overwrite="true" verbose="true">
            <fileset dir="${source.dir}">
                <include name="${source.module}" />
            </fileset>
        </copy>
    </target>

</project>

答案 2 :(得分:0)

为什么不在shell脚本而不是ant脚本中使用旧的cpcp -r允许您递归复制目录...

答案 3 :(得分:0)

要从控制台向ant提供值,您需要使用ant-properties,您可以使用-D前缀传递它们,因此您必须将构建调用为:     ant -Ddst = deploy -Dsrc = src / classes / (我也建议切换src和dst位置 - 如cp命令) 在build.xml中,您可以${dst}${src}访问此属性。

我不适合你,那么你需要为ant创建一个新的ant入口点并调用

ant -main <YourClass> arg2 arg3

示例是here(第一个示例)