2009-04-16 16 views
6

Tôi chỉ mới bắt đầu sử dụng NAnt. Tôi đã làm việc từ một hướng dẫn, và chỉ cố gắng thiết lập một mục tiêu để làm sạch giải pháp của tôi về xây dựng. Visual Studio Solution cấu trúc của tôi là như sau:Làm thế nào để đặt thư mục làm việc trong NAnt?

  • Giải pháp Thư mục
    • thư mục dự án
    • thư mục dự án
    • Công cụ thư mục
      • Nant Thư mục

Tệp NAnt .exe nằm trong thư mục Tools/NAnt. Tệp .build của tôi cũng nằm trong đó. Đây là tệp .build của tôi:

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

Đây là ví dụ mà tôi đang theo dõi đã được định dạng. Nếu tôi cố gắng chạy bản dựng này, tôi nhận được thông báo lỗi rằng tệp dự án không tồn tại. Trong mục tiêu clean.source, nếu tôi thay thế thuộc tính workingdir bằng một đường dẫn mã hóa cứng vào thư mục giải pháp cơ bản của tôi, kịch bản biên dịch và chạy một cách chính xác. Rõ ràng, đây không phải là lý tưởng cho tính di động nếu tôi cần phải di chuyển dự án ở bất cứ đâu.

Làm thế nào để tôi không nhận được thư mục cơ sở làm việc?

Trả lời

7

Đề xuất của tôi là luôn đặt tệp xây dựng ở cấp độ giải pháp. Sau đó tất cả các đường dẫn tương đối trong tệp xây dựng sẽ bằng với đường dẫn của giải pháp.

+0

Di chuyển thư mục này vào thư mục giải pháp đã hoạt động. Cảm ơn đã giúp đỡ! –

+0

Hm, một downvote? Tại sao? –

+1

Nó sẽ hoạt động, nhưng ý tôi là, lời khuyên không chính xác. Chỉ cần thiết lập basedir một cách thích hợp. (Btw, không phải là tôi đã downvoted.) – BrainSlugs83

2

Bạn có thể thử đặt thuộc tính basedir của nút dự án. Điều này có thể giải quyết vấn đề của bạn.

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

Bạn có lẽ nên thiết lập các basedir sử dụng một đường dẫn tương đối (ví dụ: ".. \ .."). – BrainSlugs83

+0

Đây là câu trả lời đúng, cùng với nhận xét để sử dụng đường dẫn tương đối. –

1

Nếu bạn đặt thuộc tính tiết của nant exec task thì nó sẽ nhổ ra dòng lệnh chính xác mà nó tạo ra. Bạn không chắc chắn vấn đề cụ thể của bạn liên quan đến việc thực thi msbuild là gì - tôi đã sử dụng nantcontrib msbuild task để thay thế.

7

Có không được xây dựng trong chức năng để thay đổi thư mục hiện hành, nhưng bạn có thể tạo ra một trong một khối kịch bản:

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

Tất nhiên, bạn nên tránh dựa vào các thư mục hiện tại trong kịch bản của bạn hoặc trong mã của bạn .

0

Hiện tại có thuộc tính workingdir bạn có thể xác định trên phần tử exec của mình.

Theo số documentation, workingdir đề cập đến "Thư mục trong đó lệnh sẽ được thực thi".

0

Là một nhiệm vụ thay vì một hàm:

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

Output:

$ nant 

build: 

    [echo] c:\Program Files