【问题标题】:How to strip the basedir from an absolute path to get a relative path?如何从绝对路径中剥离 basedir 以获得相对路径?
【发布时间】:2010-01-08 06:45:24
【问题描述】:

在我的项目的 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 relative-path


    【解决方案1】:

    从 Ant 1.8.0 开始,您可以为此使用 Ant property taskrelative 属性。

    例如:

    <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
    

    【讨论】:

    • 请注意,“basedir”属性也非常有用,因为它允许使用默认基本目录以外的其他目录。感谢您向我们展示这个解决方案,它比使用带有一些正则表达式的映射器更容易、更可靠。
    【解决方案2】:

    稍微不那么冗长的解决方案是在&lt;pathconvert&gt; 中指定somepath

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

    【讨论】:

      【解决方案3】:

      您也许可以使用 Ant basename task。如果你有:

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

      得到回显的值是“这里”。它似乎只为您提供了最终目录,可能无法满足您的需求。

      【讨论】:

      • 这就是我想要的…… 4 年后。
      【解决方案4】:

      这是在 Windows 中对我很有效的方法,改编自 @Garns 答案:

      <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>
      

      我认为handledirsep="true" 在globmapper 中非常重要,否则无论我如何摆弄正斜杠/反斜杠,它都对我不起作用。 (我在我的 ant 脚本中将所有斜线都作为正向进行,以便我可以在 unixy 系统上运行它们。)我的 Ant 版本是 1.8.1。

      【讨论】:

        【解决方案5】:

        location 使用项目的basedir 自动扩展路径。所以我认为value 选项可以让您更好地控制:

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

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

        【讨论】:

        • 我想你误解了我的问题。我已经有一个给定的路径“${base.dir}/some_dir”,我需要获取相对路径“./some_dir”。
        • 拥有some_dir的时候为什么还要解压到${somedir.dir}中?
        • ${somedir.dir} 类似于“/home/blah/mydirectory”,问题是如何从中获取“./mydirectory”。所以你不能只使用 ${somedir.dir}。在 nant 中内置了一堆函数,例如 path::get-directory-name 但我似乎无法找到 Ant 中是否存在这些函数。我也需要如何做到这一点。
        • 是的。但如您所见,我使用的是value 而不是location。因此,如果您将base.dir 设置为/home/blah 并将somedir.dir 设置为mydirectory,您将分别拥有它们,并且绝对路径将为${base.dir}/${somedir.dir}。为什么要使用选项位置将绝对路径压缩成base.dir,然后寻找从中提取工作目录的方法?
        • 如果您自己设置变量,则为真,但如果它是其他任务的输出呢?
        猜你喜欢
        • 2010-09-21
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 2011-02-26
        • 2012-10-16
        • 1970-01-01
        • 2011-02-07
        • 2012-10-25
        相关资源
        最近更新 更多