【问题标题】:ANT Script to move specified FileANT 脚本移动指定文件
【发布时间】:2012-08-13 23:41:51
【问题描述】:

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

ant deploy src/classes/myClass.class

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

ant deploy src/classes/

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

环顾四周,复制文件并不是真正的问题,但我不知道如何让它与参数一起工作(如上所述)......

有谁知道如何激活它?

【问题讨论】:

    标签: ant salesforce


    【解决方案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】:

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

      区别很微妙:编程语言要灵活得多,但你必须告诉它要采取的每一步。矩阵依赖语言计算出执行顺序。

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

      听起来你想做的事情使用标准的计算机语言会容易得多。可能是 Python、Perl,甚至是 shell 脚本。

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

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

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

      这是一个想法,为什么不首先在&lt;javac&gt; 任务中使用destdir 目标在deploy 目录中创建所需的*.class 文件。 Ant 的主要实践之一是将您构建的文件与存储库中的文件分开。它使清理工作变得容易得多。另外,&lt;javac&gt; 任务知道不为未更改的源文件重建类文件。

      <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>
      

      现在,您不必将文件从源目录复制到部署目录。更好的是,&lt;javac&gt; 不会重新编译未更改的源文件。让 Ant 完成它所设计的工作,而对于其他一切,请使用良好的脚本语言。

      【讨论】:

        【解决方案3】:

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

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

        ant -main <YourClass> arg2 arg3
        

        例子是here(第一个例子)

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-09
            • 2015-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-14
            相关资源
            最近更新 更多