Как установить рабочий каталог в NAnt? - PullRequest
6 голосов
/ 16 апреля 2009

Я только начинаю использовать NAnt. Я работал над учебным пособием и просто пытался установить цель для очистки своего решения при сборке. Моя структура решения Visual Studio выглядит следующим образом:

  • Папка с решениями
    • Папка проекта
    • Папка проекта
    • Папка с инструментами
      • Папка NAnt

Файл NAnt .exe находится в папке Tools / NAnt. Мой файл .build также там. Вот мой файл .build:

<?xml version="1.0" encoding="utf-8" ?>
<project name="NAntTest" default="build" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd">
  <property name="solution.file.name" value="NAntTest.sln" />
  <property name="project.config" value="debug" />

  <target name="build" depends="clean.source" />

  <target name="clean.source">
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
          commandline="${solution.file.name} /t:Clean /p:Configuration=${project.config} /v:q" 
          workingdir="."/>
  </target>

</project>

Вот как был отформатирован пример, которому я следую. Если я пытаюсь запустить эту сборку, я получаю сообщение о том, что файл проекта не существует. В цели clean.source, если я заменю атрибут workingdir жестко закодированным путем к папке с базовым решением, скрипт скомпилируется и будет работать правильно. Очевидно, что это не идеально для переносимости, если мне нужно перенести проект куда-нибудь.

Как мне получить NAnt, чтобы увидеть базовый рабочий каталог?

Ответы [ 6 ]

7 голосов
/ 18 марта 2011

Нет встроенной функции для изменения текущего каталога, но вы можете создать ее в блоке скрипта:

  <target name="foo">
    <echo message="Current directory set to ${directory::set-current-directory('C:')}"/>
    <echo message="Current directory is now ${directory::get-current-directory()}"/>
  </target>

  <script language="C#" prefix="directory">
    <code><![CDATA[
    [Function("set-current-directory")]
    public static string SetCurrentDirectory(string path)
    {
      System.IO.Directory.SetCurrentDirectory(path);
      return path;
    }
    ]]></code>
  </script>

Конечно, вам не следует полагаться на текущий каталог в ваших скриптах или в коде.

7 голосов
/ 16 апреля 2009

Я рекомендую всегда размещать файл сборки на уровне решения. Тогда все относительные пути в файле сборки будут равны пути решения.

2 голосов
/ 16 апреля 2009

Вы можете попробовать установить атрибут basedir узла проекта. Это может решить вашу проблему.

<project name="NAntTest" default="build" basedir="C:\Code\MyProject" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd">
1 голос
/ 16 апреля 2009

Если вы установите подробный атрибут nant exec task , тогда он будет выдавать именно ту командную строку, которую сгенерировал. Не уверен, что именно ваша проблема связана с выполнением msbuild - вместо этого я использовал задачу nantcontrib msbuild .

0 голосов
/ 26 октября 2017

В качестве задачи вместо функции:

<?xml version="1.0"?>
<project name="test" default="build">
    <script language="C#" prefix="path" >
        <code>
            <![CDATA[
            [TaskName("set-current-directory")]
            public class SetCurrentDirectory : Task {
                private string _path;

                [TaskAttribute("path", Required=true)]
                public string Path {
                    get { return _path; }
                    set { _path = value; }
                }

                protected override void ExecuteTask() {
                    System.IO.Directory.SetCurrentDirectory(_path);;
                }
            }
            ]]>
        </code>
    </script>

    <target name="build">
        <set-current-directory path="c:\Program Files" />
        <echo message="${directory::get-current-directory()}" />
     </target>
</project>

Выход:

$ nant

build:

     [echo] c:\Program Files
0 голосов
/ 27 января 2015

Теперь для элемента exec можно задать атрибут workingdir.

В соответствии с документацией , workingdir относится к "Каталогу, в котором будет выполняться команда."

...