2009-04-16 12 views
6

मैं अभी NANT का उपयोग शुरू कर रहा हूं। मैं एक ट्यूटोरियल से काम कर रहा था, और बस निर्माण पर अपने समाधान को साफ करने के लिए एक लक्ष्य निर्धारित करने की कोशिश कर रहा था।NANT में कार्य निर्देशिका कैसे सेट करें?

  • समाधान फ़ोल्डर
    • परियोजना फ़ोल्डर
    • परियोजना फ़ोल्डर
    • उपकरण फ़ोल्डर
      • NAnt फ़ोल्डर
  • : मेरी दृश्य स्टूडियो समाधान संरचना इस प्रकार है

NAnt.exe फ़ाइल टूल्स/NAnt फ़ोल्डर में रहता है। मेरी .बिल्ड फ़ाइल भी वहां है। यहां मेरी .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 लक्ष्य में, यदि मैं अपने मूल समाधान फ़ोल्डर में हार्ड कोड किए गए पथ के साथ वर्किंगडियर विशेषता को प्रतिस्थापित करता हूं, तो स्क्रिप्ट संकलित और सही ढंग से चलती है। जाहिर है, अगर पोर्टेबिलिटी के लिए यह आदर्श नहीं है तो मुझे परियोजना को कहीं भी ले जाना होगा।

आधार कार्य निर्देशिका देखने के लिए मुझे NANT कैसे प्राप्त करें?

उत्तर

7

मेरी सिफारिश हमेशा समाधान स्तर पर बिल्ड फ़ाइल को रखना है। फिर बिल्ड फ़ाइल में सभी रिश्तेदार पथ समाधान के बराबर होंगे।

+0

इसे हल करने के लिए समाधान निर्देशिका में काम किया। सहायता के लिए धन्यवाद! –

+0

एचएम, एक डाउनवोट? क्यूं कर? –

+1

यह काम करेगा, लेकिन मेरा मतलब है, सलाह बिल्कुल सही नहीं है। बस उचित आधार पर सेट करें। (बीटीडब्ल्यू, मैं नीचे नहीं था।) – BrainSlugs83

2

आप प्रोजेक्ट नोड के आधारभूत विशेषता को सेट करने का प्रयास कर सकते हैं। यह आपकी समस्या का समाधान कर सकता है।

<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

यदि आप नैन exec task की वर्बोज विशेषता सेट करते हैं तो यह उत्पन्न होने वाली सटीक कमांड लाइन को थूक देगा। सुनिश्चित नहीं है कि msbuild निष्पादित करने के संबंध में आपकी विशिष्ट समस्या क्या है - मैं इसके बजाय nantcontrib msbuild task का उपयोग कर रहा हूं।

7

वहाँ वर्तमान निर्देशिका बदलने के लिए समारोह builtin नहीं है, लेकिन आप एक स्क्रिप्ट ब्लॉक में बना सकते हैं:

<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 
संबंधित मुद्दे