gpt4 book ai didi

phing - 如何从 phing 目标返回值?

转载 作者:行者123 更新时间:2023-12-03 23:55:41 25 4
gpt4 key购买 nike

我想要一个像这样的 foreach 任务,它遍历目录“A”中的所有文件/目录 -

<foreach param="dirname" absparam="absname" target="subtask">
<fileset dir="${dir.destination}/${dir.subdir}/">
<type type="file" />
</fileset>
</foreach>

目标“子任务”应检查文件/文件夹的对应项是否存在于另一个目录“B”中(我基本上比较目录 A 和 B),如果不存在,则返回以下任一 -
  • 一只旗。
  • 文件名。

  • 以下是一些引用代码 -
    <target name="subtask">
    <if>
    <filesmatch file1="${file1}" file2="${file2}"/>
    <then>
    Return false. But how?
    </then>
    <else>
    Return true of name of the file. How?
    </else>
    </if>
    </target>

    注意 - 如果可以在不调用目标的情况下完成此操作也没关系。我不确定该逻辑是否适合 foreachtask 本身。在 phing documentation 中找不到任何这样的东西.

    基本上,在循环结束时,我应该拥有目录 B 中不存在的文件名列表。

    您也可以 read this question我的,如果您可以提供一些指示以其他方式解决问题。

    更新

    重新表述这个问题,因为我觉得问题描述不清楚。 phing documentation说,目标没有返回值 -

    Targets are collections of project components (but not other targets) that are assigned a unique name within their project. A target generally performs a specific task -- or calls other targets that perform specific tasks -- and therefore a target is a bit like a function (but a target has no return value).



    我不明白为什么要这样设计。有了这个赏金,我想知道除了必须在 PHP 中定义自己的自定义任务之外,是否还有其他解决方法。 ,然后设置属性 -
    $this->getProject()->setNewProperty('modifiedElements', implode("\n\n",$modifiedElementsArray));

    可以在构建文件中访问

    我有一个目标来检查我的生产代码库是否与预期的 git 修订版有任何差异 -
    <target name="compare_prod_with_expected_revision">
    <input propertyname="box.git_version">
    Enter git version of the production codebase:
    </input>
    <exec command="git reset --hard ${box.git_version}" dir="${dir.scratchpad}" />
    <!-- Scratchpad brought to revision ${box.git_version} -->

    <echo>Verifying whether production is at revision ${box.git_version}..</echo>
    <exec command="diff -arq --exclude='.git' ${dir.scratchpad}/${dir.subdir} ${dir.destination}/${dir.subdir}" outputProperty="diffList"/><!-- #TODO ignore.swp files in this step. Diff says .swp files present in production code. But doing ls -a there does not show the same. -->
    <php function="strlen" returnProperty="productionDeviationFromExpectedBranch"><!-- #TODO - find how to not show this step during build process. Put it in a target and set hidden="true" -->
    <param value="${diffList}"/>
    </php>
    <if>
    <equals arg1="${productionDeviationFromExpectedBranch}" arg2="0" />
    <then>
    <echo>Verified production is at revision ${box.git_version}</echo>
    </then>
    <else>
    <echo>Differences - </echo>
    <echo>${diffList}</echo>
    </else>
    </if>
    </target>

    现在,我要 phingcall这个目标并想访问它设置的一些属性。

    最佳答案

    我想我理解你的目的,同时我觉得你没有选择这样做的最佳工具。

    正如您在问题中提到的,关于 phing 的官方文档对任务(目标)很清楚:

    Targets are collections of project components (but not other targets) that are assigned a unique name within their project. A target generally performs a specific task -- or calls other targets that perform specific tasks -- and therefore a target is a bit like a function (but a target has no return value).



    目标应该是应用程序的组件,它们执行特定的任务,原子任务。可以是初始化任务、配置获取、编译步骤、 Assets 准备和转储、部署任务、清理任务等。 没有标准意义上的target返回的“输出”,但是target执行的结果是执行本身的成功:成功或失败 .

    人们不应该试图在这样的项目目标中加入太多的逻辑,因为它是 无意 做复杂的计算,做大量的逻辑决策等。我的意思是,Phing 可以做到,这样的事情是可能的,但这种设置会很笨重,不可读,并且难以扩展/重构。

    使用 Phing,您可以轻松定义逻辑流的条件执行和分支,您可以定义任务(依赖项)的执行顺序 - 这就是它简洁优雅的原因。保持目标尽可能简单,将项目拆分为小的、已完成的逻辑任务。

    根据我一直在处理的项目,最大的目标可能是初始化阶段和配置获取。这是一些示例,为了了解它可能包含的内容,我从实际项目中获取了它:
    <target name="init_configuration">
    <echo msg="Define initial configuration for the deployment..." />
    <if>
    <not>
    <isset property="host" />
    </not>
    <then>
    <property name="host" value="dev" override="true" />
    <echo message="The value of hostname has been set to ${host}" />
    </then>
    <else>
    <echo message="The value of hostname is ${host}" />
    </else>
    </if>
    <if>
    <not>
    <isset property="version" />
    </not>
    <then>
    <property name="version" value="1.0.0" override="true" />
    <echo message="The value of version has been set to ${version}" />
    </then>
    <else>
    <echo message="The value of version is ${version}" />
    </else>
    </if>

    <property name="host_credital_file" value="config/hosts/${host}.properties" />
    <property file="${host_credital_file}" />
    <available file="${host_credital_file}" property="hostfilefound" value="true"/>
    <fail unless="hostfilefound" message="Missing Hostfile configuration file (${host_credital_file})!" />

    <echo msg="Configuration is done" />
    </target>

    其他目标是 极其简单,它们通常是 – 1-5 行长 ,只做小目标,小任务。这可能是使用 Phing 时的最佳建议。

    您试图放在 Phing 肩膀上的逻辑是可能的,但会非常笨重。

    考虑这一点:在您的示例中,使用简单的 bash 脚本可以更快、更容易、更易读地完成相同的事情。或者甚至用 PHP 编写小的 CLI 实用程序,这将优雅而快速地完成工作。之后,在 Phing 中,您将离开参数目标,该目标将从 CLI 执行此“修订差异脚本”。

    Phing 是一个很好的工具,它的设计目的是什么,但它不可能是所有用途的最佳选择。只是不要把太多的责任和逻辑放在里面。

    作为 解决方法 , 对于更复杂的事情 最好将 Phing 与一些专门的东西结合起来:bash 脚本、PHP CLI、nodeJS(+ Grunt、Gulp 等)......并且稍后添加 Phing 目标的调用 .

    关于phing - 如何从 phing 目标返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36618678/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com