Nant:无法从.include获取当前目录

时间:2011-03-31 20:53:39

标签: nant

我总结一下这并不容易......我在磁盘上有这个结构:

[dir]项目

  • [dir] foo
    • [file] foo.build
  • [dir] bar
    • [file] bar.build
  • [file] default.include

文件default.include包含几个属性,这些属性是构建期间使用的目录。例如:     property name =“build.dir”value =“$ {directory :: get-current-directory}”。

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

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

我可以使用%~dp0

在批处理文件中执行此操作

3 个答案:

答案 0 :(得分:1)

您可以使用此

指定项目的基本目录
<property name="build.dir" value="${project::get-base-directory()}">

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

答案 1 :(得分:0)

在包含共享包含内容之前,您可以将构建路径属性设置为工作文件夹和项目根目录之间的相对差异。所以,在\ 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 \)。

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

答案 2 :(得分:0)

刚刚得到完全相同的问题: NAnt - how to get the directory path of the included script

在我的include文件中,我需要获取包含文件的目录,以引用相对于它的其他内容。 好像当NAnt包含另一个构建文件时,它包含它的内容,而不改变其环境中的任何内容(directory :: get-current-directory,project :: get-buildfile-path等)。

您的案例中的另一个解决方案可能是使用<nant>任务而不是<include>。显然,如果您不需要从包含的脚本返回任何内容并且只想运行它,它就可以工作。