导入目录中的所有构建文件 - phing

时间:2012-05-21 17:55:20

标签: phing

我需要使用ImportTask在我当前build.xml的目录中包含所有xml文件(我不知道名称和文件数)。

这是我的build.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<project name="New Project" basedir="." default="myimport">
    <target name="myimport" description="dummy to import other build files">
        <if>
            <isset property="file" />
            <then>
                <echo msg="Importing ${file}" />
                <import file="${file}" />
            </then>
        </if>
    </target>

    <if>
        <not>
            <isset property="dummy.property" />
        </not>
        <then>
            <echo msg="Now include all files in ./dev/build directory" />
            <property name="dummy.property" value="true" />
            <foreach param="msg" absparam="file" target="myimport">
                <fileset dir="./dev/build/">
                    <include name="*.xml"/>
                </fileset>
            </foreach>
        </then>
    </if>
</project>

和目标目录中的示例文件:

<?xml version="1.0" encoding="utf-8"?>
<project name="test" basedir="." default="dummy">
    <target name="dummy" description="Dummy task">
        <echo msg="Dummy task, just for test" />
    </target>

    <echo msg="Imported!" />
</project>

当我运行phing -l时,结果为:

Buildfile: /home/f0rud/workspace/s/build.xml
     [echo] Now include all files in ./dev/build directory
  [foreach] Calling Buildfile '/home/f0rud/workspace/s/build.xml' with target 'myimport'

New Project > myimport:

     [echo] Importing ./dev/build/test.xml
     [echo] Imported!
Default target:
----------------------------------------------------------------------------
 myimport  dummy to import other build files

Main targets:
----------------------------------------------------------------------------
 myimport  dummy to import other build files

但是没有虚拟(或test.dummy)目标,为什么?

注意:有一个有趣的错误,如果我删除if部分,我得到Maximum function nesting level of '100' reached, aborting! error但这不是我的问题(如果解决了这个问题。)

1 个答案:

答案 0 :(得分:1)

问题是全球背景下的导入工作。

当我在目标中调用它时,它在全局上下文中不可用。

所以我编写了一个简单的Phing任务来加载文件集的所有文件,如下所示:

class ImportDirTask extends Task {

    /** Array of filesets */
    private $filesets = array();

    /**
     * Nested creator, adds a set of files (nested fileset attribute).
     */
    function createFileSet() {
        $num = array_push($this->filesets, new FileSet());
        return $this->filesets[$num-1];
    }

  /**
   * Parse a Phing build file and copy the properties, tasks, data types and 
   * targets it defines into the current project.
   *
   * @return void
   */
  public function main () {
    // filesets
    foreach ($this->filesets as $fs) {
        $ds       = $fs->getDirectoryScanner($this->project);
        $srcFiles = $ds->getIncludedFiles();
        $srcDirs  = $ds->getIncludedDirectories();
        foreach ($srcFiles as $f)
        {
            $task = new ImportTask();
            $task->setProject($this->project);
            $task->init();
            $task->setFile($this->file = $fs->getDir($this->project) . FileSystem::getFileSystem()->getSeparator() . $f);
            $task->main();
        }

     }
  } //end main

} //end ImportDirTask

它只是工作。