2009-04-16 2 views
6

Я только начинаю использовать NAnt. Я работал из учебника и просто пытался установить цель для очистки моего решения при сборке. Моя Визуальная структура Студия Решение выглядит следующим образом:Как установить рабочий каталог в NAnt?

  • Solution Folder
    • Папка проекта
    • Папка проекта
    • Инструменты Папка
      • 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, чтобы увидеть базовый рабочий каталог?

ответ

7

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

+0

Работа с этим каталогом решений. Спасибо за помощь! –

+0

Хм, нисходящая линия? Зачем? –

+1

Это сработает, но я имею в виду, что совет не совсем звучит. Просто установите для себя соответствующим образом. (Btw, не было меня, что было подано). – BrainSlugs83

2

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

<project name="NAntTest" default="build" basedir="C:\Code\MyProject" xmlns="http://nant.sf.net/release/0.86-beta1/nant.xsd"> 
+1

Вы, вероятно, следует установить BASEDIR, используя относительный путь (т.е. ".. \ .."). – BrainSlugs83

+0

Это правильный ответ, а также комментарий для использования относительного пути. –

1

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

7

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

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

Конечно, вы должны избегать полагаться на текущий каталог в сценариях или в коде ,

0

В данный момент есть атрибут workingdir, который вы можете определить на своем элементе exec.

Согласно documentation, workingdir ссылается на «каталог, в котором будет выполняться команда».

0

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

<?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 
Смежные вопросы