【问题标题】:Exclude files with Ant使用 Ant 排除文件
【发布时间】:2011-12-09 23:40:49
【问题描述】:

我正在创建一个 PHP 项目,我希望分发 2 个版本:免费版本和专业版本。

增强功能都在某些文件中,所以我只需“跳过”它们即可创建免费版本。
我的问题是:实现这一目标的最佳方法是什么?
我可以列出 build.xml 文件中的每个文件(它们最多为 20 个),但它非常难看,而且如果我忘记更新列表,我会添加这些文件...

我考虑过使用 contains 关键字,但它会减慢我的构建速度?

编辑
这是我的 build.xml 文件:

<project name="MyProject" default="build" basedir=".">
<property name="buildDir"   value="${basedir}/build"/>
<property name="componente" value="${basedir}/trunk/componente"/>
<property name="backend"    value="${componente}/backend"/>
<property name="frontend"   value="${componente}/frontend"/>

<target name="build" depends="cleanup, pro, free" />

<!-- Clean up the build directory output -->
<target name="cleanup">
    <echo>Clean up build directory</echo>
    <delete includeemptydirs="true">
        <fileset dir="${buildDir}" includes="**/*"/>
    </delete>
</target>

<!-- Create the pro package (no file exclusion) -->
<target name="pro">
    <echo>Build pro version</echo>
    <zip destfile="${buildDir}/pro.zip" basedir="${componente}" />
</target>

<!-- Create the free package (file exclusion) -->
<target name="free">
    <echo>Build free version</echo>
</target>

编辑 2 我的专业文件位于不同的文件夹中,因为我使用的是 MVC 模式,所以我无法移动它们

【问题讨论】:

  • 你试过了吗?它奏效了吗?它是否减慢了您的构建速度?

标签: php ant build


【解决方案1】:

引用Ant Manual

zip 任务形成一个隐式 FileSet,并支持&lt;fileset&gt; 的大多数属性(dir 变为 basedir)以及嵌套的&lt;include&gt;&lt;exclude&gt;&lt;patternset&gt; 元素。

这意味着你可以做到

<zip destfile="${buildDir}/free.zip"
     basedir="${componente}"
     excludes="**/features/pro/**, **/other/**"/>

关于

编辑 2 我的 pro 文件位于不同的文件夹中,因为我使用的是 MVC 模式,所以我无法移动它们

MVC 根本与文件夹布局无关。 It's about roles and responsibilities。它没有说明将文件放在哪里。一些框架规定了类文件的放置位置,但只要您的自动加载器可以找到类文件,它们在哪里并不重要:所以是的,您可以移动它们。

【讨论】:

    【解决方案2】:

    您可以简单地使用文件集:

    http://ant.apache.org/manual/Types/fileset.html

    <fileset dir="${files.directory}" casesensitive="yes">
      <include name="**/*free.php"/>
      <exclude name="**/*pro.php"/>
    </fileset>
    

    当然,您必须在包含/排除元素中提供不同的名称。理想情况下,您可以将 pro 内容分离到不同的文件中,然后简单地排除整个目录。

    【讨论】:

    • 是的,我知道,但这很容易出错,因为我的文件不在同一个目录中,而且我往往会忘记一些事情:P
    • @tampe125 嗯,那你需要整理一下。这是排除/包含文件的默认 ant 机制。您甚至可以使用其他标准,例如文件内容或修改日期等,但最终您将不得不使用此任务。
    • 是的,但是我使用的是 MVC 模式,所以东西被分成了几个文件夹。
    【解决方案3】:

    好的,我找到了。 我在我的排除文件中添加了一个 PHPDoc 标记:
    @category ProPackage

    然后我在 build.xml 中添加了这些规则

    <target name="free">
        <zip destfile="${buildDir}/pro.zip">
            <fileset dir="${componente}">
                <not>
                    <containsregexp expression="@category[ \t]+ProPackage"/>
                </not>
            </fileset>
        </zip>
    </target>
    

    它已经完成了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多