Нант: не могу получить текущий каталог из .include - PullRequest
2 голосов
/ 01 апреля 2011

Мне не совсем легко обобщить это ... У меня есть такая структура на диске:

[dir] проект

  • [dir] foo
    • [файл] foo.build
  • [dir] бар
    • [файл] bar.build
  • [файл] default.include

Файл default.include содержит несколько свойств, которые являются каталогами, используемыми во время сборки. Например: свойство name = "build.dir" value = "$ {directory :: get-current-directory}".

Файл default.include включается в foo.build и bar.build, используя их относительный путь: include buildfile = ".. \ default.include"

Теперь проблема: когда я запускаю foo.build из проекта \ foo dir, я получаю неправильное значение для build.dir. Мне нужен «проект», и вместо этого я получаю «проект \ foo». Есть ли способ получить каталог, в котором существует файл .include?

Я мог бы сделать это в командном файле, используя% ~ dp0

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

вы можете указать базовый каталог проекта, используя этот

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

и убедитесь, что вы установили путь вывода сборки равным build.dir

0 голосов
/ 14 сентября 2012

Просто получил точно такую ​​же проблему: NAnt - как получить путь к каталогу включенного скрипта

В моем включаемом файле мне нужно получить каталог включаемого файла, чтобы сослаться на что-то еще относительно него. Похоже, когда NAnt включает другой файл сборки, он включает его содержимое, ничего не меняя в своей среде (directory :: get-current-directory, project :: get-buildfile-path и т. Д.).

Другим решением в вашем случае может быть использование задачи <nant> вместо <include>. Очевидно, это работает, если вам не нужно ничего возвращать из включенного скрипта и просто хотите его запустить.

0 голосов
/ 03 апреля 2011

Вы можете установить свойство пути сборки как относительную разницу между рабочей папкой и корневым каталогом проекта, прежде чем включать ваши общие файлы включения. Итак, в \ 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 \).

Лично я делаю все наоборот - у меня есть основной файл сборки в корне проекта, и он включает файл сборки для каждого подпроекта. Физически сборка распределяется по проектам, но логически все выполняется так, как если бы это был один большой скрипт в корне проекта. Недостатком является то, что глобальные имена свойств и целевые имена могут конфликтовать, поэтому вам нужно соглашение об именах, чтобы этого не происходило.

...