2

私は、VSS から Subversion に移行するための一時的な解決策として、VSS の「シャドウ フォルダー」の概念を模倣することを目的とした Ant スクリプトに取り組んでいます (ビルド管理ソフトウェアを再構成する必要はありません)。スクリプトはかなり単純です。

  • ビルドフォルダーを作成する
  • ソース ファイルを Subversion からビルド フォルダーに抽出する
  • ソースファイルを翻訳する
  • ソースおよびオブジェクト コード ファイルをビルド フォルダーからデプロイに使用される最終的な場所にコピーします。

トランク全体をビルドフォルダーにプルダウンしてそこから移動する場合、すべてが「うまく」機能します...「ビルド」に30分以上かかることを除いて、投稿の一部としてこれを開始したいと思っていました-commit イベント (ここでも、VSS の「シャドウ フォルダー」機能を模倣します。これは、VSS データベースから独立したフォルダー内のすべてのファイルの「最新の」コピーを保持し、すべてのチェックインに応じて更新されます)。

私は、変更されたファイルだけのよりターゲットを絞ったダウンロードを実行することを目標に、スクリプトをハッキングしてきました (svn diff はファイルのリストを提供し、svn export を使用してそれらを個別にプルダウンできると思います)。 .

さて、質問に: Ant Core を使用して、リストの各要素のターゲットを「反復的に」呼び出す方法はありますか? これは、ここに投稿された質問の繰り返しです。

antでは、ファイルのリストにターゲットを適用する方法(ant-contribなし)?

しかし、これがネイティブにできないことを受け入れることを拒否します。この郵便受け:

リストの各要素をタスク Ant の引数に配布する方法は?

希望を与えてくれますが、Ant がどのように動作するか (または設計されたか) をあきらめる基本的な理解が欠けています。私は次のようなことができることを願っています:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test XmlProperty" default="test" basedir=".">
   <target name="test">
      <xmlproperty file="log.xml" collapseAttributes="true" />
      <echo>Affected resources: ${log.logentry.paths.path}</echo>

      <macrodef name="svnExportFile">
         <attribute name="svnRepoUrls"/>

         <sequential>
            <loadresource property="lead.path">
               <string value="${svnRepoUrls}"/>
               <filterchain>
                  <tokenfilter>
                     <replaceregex pattern="(\w+)[,${line.separator}]*.*" replace="\1" flags="g"/>
                  </tokenfilter>
               </filterchain>
            </loadresource>

            <loadresource property="rest.paths">
               <string value="${svnRepoUrls}"/>
               <filterchain>
                  <tokenfilter>
                     <replaceregex pattern="(\w+)[,${line.separator}]*(.*)" replace="\2" flags="g"/>
                  </tokenfilter>
               </filterchain>
            </loadresource>

            <echo message="${lead.path}"/>
            <echo message="${rest.paths}"/>

            <svnExportFile svnRepoUrls="${rest.paths}"/>
         </sequential>
      </macrodef>

      <svnExportFile svnRepoUrls="${log.logentry.paths.path}"/>
   </target>
</project>

ただし、正規表現が正しく機能していません。これは Ant の重大な違反ですか? 希望を捨てて、単に Ant-contrib で実行する必要がありますか? 2008 年以降更新がないように見え、これらすべてが機能するために必要な依存関係の量を制限したいと思っていたので、私はそれを採用するのに時間がかかりました。

何かご意見は?

編集:私は(一種の)近づいています...上記のコードは最初の投稿で正しく引用されておらず、投稿する前に試す機会がありませんでした(離れる必要があり、失いたくありませんでした私が入力したすべて)。とにかく、再帰を停止する方法はありません (そして、プロパティは不変であると思われるため、希望どおりにリセットされません)、機能しません (まだ?)。

上記と同じ基本概念を達成しようとしました (嫌われていることは知っていますが、 if/unless 属性を介して条件付きでタスクを実行できるという点で非常に便利です)-ただし、これは機能しません。どうやら再帰を許可したくない:

「独自の親ターゲットを呼び出す antcall タスク」

そして依存を介して再帰を開始しようとしています:

'循環依存: svn.export.file <- svn.export.file'

興味のある方のために、バージョンは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test XmlProperty" default="test" basedir=".">
   <target name="test">
      <xmlproperty file="log.xml" collapseAttributes="true" />
      <echo>Affected resources: ${log.logentry.paths.path}</echo>

      <antcall target="svn.export.file" inheritAll="false">
         <param name="svnRepoUrls" value="${log.logentry.paths.path}"/>
      </antcall>
   </target>

   <target name="svn.export.file" if="svnRepoUrls">
      <loadresource property="lead.path">
         <string value="${svnRepoUrls}"/>
         <filterchain>
            <tokenfilter>
               <replaceregex pattern="(\w+)[,${line.separator}]*.*" replace="\1" flags="g"/>
            </tokenfilter>
         </filterchain>
      </loadresource>

      <loadresource property="rest.paths">
         <string value="${svnRepoUrls}"/>
         <filterchain>
            <tokenfilter>
               <replaceregex pattern="(\w+)[,${line.separator}]*(.*)" replace="\2" flags="g"/>
            </tokenfilter>
         </filterchain>
      </loadresource>

      <echo message="${lead.path}"/>
      <echo message="${rest.paths}"/>

      <antcall target="svn.export.file" inheritAll="false">
         <param name="svnRepoUrls" value="${rest.paths}"/>
      </antcall>

   </target>
</project>
4

1 に答える 1

0

私は認めます、それは醜いです...そして私が私の解決策としてそれを続けるつもりかどうかはあまりわかりません(この「コード」は醜くて混乱しているので、私は先に進んでant-contribをインストールするかもしれないと思います)-しかし、それはトリックを行うようであり、そうです、リスト内の各要素のターゲットを、!に依存せずに呼び出すことができるという私の理論を証明しています。

<?xml version="1.0" encoding="UTF-8"?>
<project name="Test XmlProperty" default="test" basedir=".">
   <target name="test">
      <xmlproperty file="log.xml" collapseAttributes="true" />
      <echo>Affected resources: ${log.logentry.paths.path}</echo>

      <antcall target="svn.export" inheritAll="false">
         <param name="svn.repo.urls" value="${log.logentry.paths.path}"/>
      </antcall>
   </target>
   <target name="svn.export" if="svn.repo.urls">
      <macrodef name="svnExportFile">
         <attribute name="urls"/>

         <sequential>
            <macrodef name="parsePath">
               <attribute name="property"/>
               <attribute name="replacePart"/>

               <sequential>
                  <loadresource property="@{property}">
                     <string value="@{urls}"/>
                     <filterchain>
                        <tokenfilter>
                           <replaceregex pattern="([^,]+),?(.*)" replace="@{replacePart}" flags="g"/>
                        </tokenfilter>
                     </filterchain>
                  </loadresource>
               </sequential>
            </macrodef>

            <parsePath property="lead.path" replacePart="\1"/>
            <fail>
               <condition>
                  <not>
                     <isset property="lead.path"/>
                  </not>
               </condition>
            </fail>
            <parsePath property="rest.paths" replacePart="\2"/>

            <echo>lead.path:${lead.path}</echo>
            <echo>rest.paths:${rest.paths}</echo>

            <antcall target="svn.export.deux"/>
         </sequential>
      </macrodef>

      <svnExportFile urls="${svn.repo.urls}"/>
   </target>
   <target name="svn.export.deux" if="rest.paths">
      <echo>rest.paths:${rest.paths}</echo>
      <echo>svn.repo.urls:${svn.repo.urls}</echo>
      <antcall target="svn.export" inheritAll="false">
         <param name="svn.repo.urls" value="${rest.paths}"/>
      </antcall>
   </target>
</project>
于 2012-06-15T02:37:27.780 に答える