web-dev-qa-db-ja.com

相対パスを取得するために絶対パスからbasedirを取り除く方法は?

プロジェクトの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>

他の(よりエレガントな)提案はありますか?

24
blackicecube

Ant 1.8.0以降では、Ant relative taskproperty属性を使用できます。

例えば:

<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
43
martin clayton

少し冗長な解決策は、<pathconvert>内にsomepathを指定することです。

<pathconvert property="relative.dir">
  <path location="${somepath}"/>
  <globmapper from="${basedir}/*" to="./*" />
</pathconvert>
7
Garns

Ant basename task を使用できる場合があります。あなたが持っている場合:

<property name="somedir" value="/path/to/file/here" />
<basename file="${somedir}" property="somebasedir" />
<echo>${somebasedir}</echo>

エコーされる値は「ここ」です。それはあなたにあなたが望むものを十分に得ていないかもしれない最終的なディレクトリを与えるようです。

3

これは、@ 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です。

1
DWoldrich

locationは、プロジェクトのbasedirを使用してパスを自動的に展開します。だから私はvalueオプションがあなたにより良い制御を与えると思います:

<property name="base.dir" value="/home/myuser"/>

そして

<property name="somedir.dir" value="${base.dir}/some_dir"/>
0
Anonymous