【问题标题】:Nant: can't get current directory from .includeNant:无法从 .include 获取当前目录
【发布时间】:2011-03-31 20:53:38
【问题描述】:

这对我来说并不容易总结...我在磁盘上有这个结构:

[目录] 项目

  • [目录] foo
    • [文件] foo.build
  • [目录] 栏
    • [文件] bar.build
  • [文件] default.include

文件 default.include 包含几个属性,它们是构建期间使用的目录。例如: 属性名称="build.dir" value="${directory::get-current-directory}"。

foo.build 和 bar.build 使用其相对路径包含 default.include 文件: 包括 buildfile="..\default.include"

现在的问题是:当我从 project\foo 目录运行 foo.build 时,我得到了错误的 build.dir 值。我需要“项目”,而我得到“项目\ foo”。有没有办法获取.include文件所在的目录?

我可以使用 %~dp0 在批处理文件中执行此操作

【问题讨论】:

    标签: nant


    【解决方案1】:

    你可以使用这个来指定项目的基目录

    <property name="build.dir" value="${project::get-base-directory()}">
    

    并确保将构建输出路径设置为build.dir

    【讨论】:

    • 感谢您的回复。你是说我应该将项目 foo 定义为:&lt;project name="foo" basedir="..\default.include" /&gt; 我不能这样做,basedir 总是“。” (我需要引用 foo 目录中的其他目录......)必须有另一种方式。
    【解决方案2】:

    在包含共享的包含内容之前,您可以将构建路径属性设置为工作文件夹和项目根目录之间的相对差异。所以,在 \project\foo\foo.build:

    <property name="build.dir" value="..\" />
    <include buildfile="..\default.include" />
    

    如果您想引用与项目根目录相关的内容,则只需从 build.dir 构建路径。假设您有一个 \project\utilities\ 文件夹,其中放置了一些自定义构建工具或其他东西,那么您可以将该文件夹称为:

    <property name="utils.dir" value="${build.dir}utilities\" />
    

    utils.dir 将是 ..\utilities\,这将是您工作文件夹中的正确值(在本例中为 \project\foo\)。

    就我个人而言,我做的事情是相反的——我在项目的根目录中有一个主构建文件,它包含每个子项目的构建文件。从物理上讲,构建分布在项目中,但从逻辑上讲,它都像项目根目录中的一个大脚本一样运行。缺点是全局属性名称和目标名称可能会发生冲突,因此您需要一个命名约定来防止这种情况发生。

    【讨论】:

      【解决方案3】:

      刚刚遇到了同样的问题: NAnt - how to get the directory path of the included script

      在我的包含文件中,我需要获取包含文件的目录,以引用与它相关的其他内容。 似乎当 NAnt 包含另一个构建文件时,它包含了它的内容,而不更改其环境中的任何内容(目录::get-current-directory、project::get-buildfile-path 等)。

      在您的情况下,另一种解决方案可能是使用&lt;nant&gt; 任务而不是&lt;include&gt;。显然,如果您不需要从包含的脚本返回任何内容而只想运行它,它就可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 2013-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        相关资源
        最近更新 更多