質問
を使用してコピー操作を実行する Ant スクリプトがあります。 「コピー」タスク. 。これは Windows 用に書かれており、'todir' 引数としてハードコーディングされた C:\ パスがあります。「exec」タスクに OS 引数があるようですが、OS に基づいてコピーを分岐する同様の方法はありますか?
解決
プロパティにパスを入力し、現在の OS に基づいて条件付きでプロパティを設定することをお勧めします。
<condition property="foo.path" value="C:\Foo\Dir">
<os family="windows"/>
</condition>
<condition property="foo.path" value="/home/foo/dir">
<os family="unix"/>
</condition>
<fail unless="foo.path">No foo.path set for this OS!</fail>
副次的な利点として、プロパティに追加すると、Ant スクリプトを編集せずにオーバーライドできるようになります。
他のヒント
以前に投稿した OS 固有の変数の提案は機能しますが、多くの場合、「C:」プレフィックスを省略し、スラッシュ (Unix スタイル) ファイル パスを使用するだけで、Windows と Unix システムの両方で機能します。
したがって、ファイルを Windows では「C:/tmp」に、Unix では「/tmp」にコピーする場合は、次のようなものを使用できます。
<copy todir="/tmp" overwrite="true" >
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
</copy>
OS に基づいて条件付きパスを設定する必要がある場合は、次のように簡略化できます。
<condition property="root.drive" value="C:/" else="/">
<os family="windows" />
</condition>
<copy todir="${root.drive}tmp" overwrite="true" >
<fileset dir="${lib.dir}">
<include name="*.jar" />
</fileset>
</copy>
条件タスクを使用して、別のコピー タスクに分岐することもできます。アリのマニュアルから:
<condition property="isMacOsButNotMacOsX">
<and>
<os family="mac"/>
<not>
<os family="unix"/>
</not>
</and>
操作のルート フォルダーである変数を宣言します。コピー タスクを含め、フォルダーにその変数をプレフィックスとして付けます。
条件を使用して OS に基づいて変数を設定するか、それを引数として Ant スクリプトに渡します。
型によっては変数を使って代入することはできないのでしょうか?に入れてもいいでしょう build.properties
ファイル。または、を使用して割り当てることもできます 状態.
Ant-contrib には <osfamily /> タスクがあります。これにより、OS のファミリーが (名前を指定した) プロパティに公開されます。これは何らかの利点があるかもしれません。