プロジェクトのbuild.xmlで、プロパティを定義しています。
<property name="somedir.dir" location="my_project/some_dir"/>
${somedir.dir}
の値は、絶対パス:/home/myuser/my_project/some_dir
になります。
必要なのは、./my_project/some_dir
値${basedir}
なしの相対パス/home/myuser
だけです。 Antを使用してこれをどのように達成できますか?
これまでのところ、プロパティをパスに変換してから「pathconvert」を使用することで解決策を見つけましたが、これは素晴らしい解決策ではないと思います。
<path id="temp.path">
<pathelement location="${somedir.dir}" />
</path>
<pathconvert property="relative.dir" refid="temp.path">
<globmapper from="${basedir}/*" to="./*" />
</pathconvert>
他の(よりエレガントな)提案はありますか?
Ant 1.8.0以降では、Ant relative
task のproperty
属性を使用できます。
例えば:
<property name="somedir.dir" location="my_project/some_dir"/>
<echo message="${somedir.dir}" />
<property name="somedir.rel" value="${somedir.dir}" relative="yes" />
<echo message="${somedir.rel}" />
につながる:
[echo] /home/.../stack_overflow/ant/my_project/some_dir
[echo] my_project/some_dir
少し冗長な解決策は、<pathconvert>
内にsomepath
を指定することです。
<pathconvert property="relative.dir">
<path location="${somepath}"/>
<globmapper from="${basedir}/*" to="./*" />
</pathconvert>
Ant basename
task を使用できる場合があります。あなたが持っている場合:
<property name="somedir" value="/path/to/file/here" />
<basename file="${somedir}" property="somebasedir" />
<echo>${somebasedir}</echo>
エコーされる値は「ここ」です。それはあなたにあなたが望むものを十分に得ていないかもしれない最終的なディレクトリを与えるようです。
これは、@ Garnsの回答を基に、Windowsでうまく機能するアプローチでした。
<path id="uploadFilePath">
<fileset dir="${wcm.folderName}">
<include name="*" />
<exclude name="*.attr" />
</fileset>
</path>
<pathconvert property="relFilelist">
<path refid="uploadFilePath" />
<mapper>
<globmapper from="${wcm.folderName}/*" to="*" handledirsep="true" />
</mapper>
</pathconvert>
Handleirsep = "true"はglobmapperでかなり重要だと思いますが、フォワード/バックスラッシュをいじっても、それは私にとってはうまくいきませんでした。 (私はすべてのスラッシュをantスクリプトで前に進めるようにして、ユニキシシステムで実行できるようにします。)私のAntのバージョンは1.8.1です。
location
は、プロジェクトのbasedir
を使用してパスを自動的に展開します。だから私はvalue
オプションがあなたにより良い制御を与えると思います:
<property name="base.dir" value="/home/myuser"/>
そして
<property name="somedir.dir" value="${base.dir}/some_dir"/>