2008-10-24 8 views
22

से एक लक्ष्य निर्दिष्ट करना मेरे पास एक समाधान फ़ाइल में एक विशिष्ट प्रोजेक्ट बनाने के लिए एक एमएसबिल्ड कार्य है। यह इस तरह दिखता है: कमांड लाइन सेएमएसबिल्ड: कमांड लाइन

<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar:$(BuildCmd)" /> 
</Target> 

, मैं सेट कर सकते हैं मेरी BuildCmd के लिए या तो Rebuild या Clean और यह उम्मीद के रूप में काम करता है:

MSBuild/लक्ष्य: बाज/संपत्ति: BuildCmd = पुनर्निर्माण MyMsbuildFile.xml MSBuild/लक्ष्य: बाज/संपत्ति: BuildCmd = स्वच्छ MyMsbuildFile.xml

लेकिन क्या शब्द मैं BuildCmd टी सेट करने के लिए प्रयोग करते हैं ओ बस निर्माण करने के लिए? मैंने Build और Compile और इसे खाली या अपरिभाषित करने का प्रयास किया है, लेकिन मुझे हमेशा एक त्रुटि मिलती है।

MSBuild/लक्ष्य: बाज/संपत्ति: BuildCmd = बिल्ड MyMsbuildFile.xml Foo.sln: त्रुटि MSB4057: लक्ष्य "बार: निर्माण" परियोजना में मौजूद नहीं है।

msbuild/target: Baz/property: BuildCmd = MyMsbuildFile.xml संकलित करें Foo.sln: त्रुटि MSB4057: लक्ष्य "बार: संकलन" परियोजना में मौजूद नहीं है।

msbuild/target: Baz MyMsbuildFile.xml Foo.sln: त्रुटि MSB4057: लक्ष्य "बार:" प्रोजेक्ट में मौजूद नहीं है।

उत्तर

21

मैं समझ गया कि आप एक विशिष्ट आदेश के साथ एक लक्ष्य का निर्माण करना चाहते: निर्माण, स्वच्छ, आदि

यह मैं इसे कैसे करना होगा है।

जब चूक निर्दिष्ट नहीं

<PropertyGroup> 
    <BuildCmd Condition=" '$(BuildCmd)' == ''">Build</BuildCmd> 
</PropertyGroup> 

के बाद का निर्माण करने के लिए एक प्रॉपर्टी बनाएं अपने निर्माण आदेश, प्राप्त करने के लिए, लक्ष्य है कि पैरामीटर में निर्दिष्ट लक्ष्य के साथ MSBuild शुरू कर देंगे बनाएँ:

<Target Name="Stackoverflow"> 
    <MsBuild Projects="Foo.sln" Targets="$(BuildCmd)" /> 
</Target> 

फिर अपनी एमएसबील्ड फ़ाइल को लक्ष्य और BuildCmd पैरामीटर के साथ कॉल करें:

msbuild msbuild.xml /t:Stackoverflow /p:BuildCmd=Clean 

बस सुनिश्चित करें कि समाधान समाधान या प्रोजेक्ट फ़ाइल में मौजूद है।

<PropertyGroup> 
    <ProjBuildCmd Condition="'$(BuildCmd)' != 'Build'">:$(BuildCmd)</ProjBuildCmd> 
    <SolnBuildCmd Condition="'$(BuildCmd)' != 'Build'">$(BuildCmd)</SolnBuildCmd> 
</PropertyGroup> 

और फिर बजाय का उपयोग कर $(BuildCmd) सीधे, मैं $(ProjBuildCmd) या $(SolnBuildCmd) का उपयोग इस तरह::

+1

मैं Foo.sln के भीतर केवल एक विशिष्ट प्रोजेक्ट बनाने की कोशिश कर रहा हूं। –

+0

नीचे मेरा जवाब देखें। –

+0

"बस सुनिश्चित करें कि लक्ष्य समाधान या प्रोजेक्ट फ़ाइल में मौजूद है।"। आप एक एसएलएन फ़ाइल में कस्टम लक्ष्य कैसे जोड़ते हैं? –

-7

बस स्वयं को एसएलएन फ़ाइल संपादित करें और पता लगाएं - एमएसबिल्ड एक वास्तविक आसान वाक्यविन्यास है, केवल लक्ष्य की तलाश करें।

+3

.sln फ़ाइल MSBuild वाक्यविन्यास में नहीं है। –

6

से: http://msdn.microsoft.com/en-us/library/ms164311.aspx

/लक्ष्य:

इस परियोजना में इन लक्ष्यों को बनाता निशाना बनाता है। एकाधिक लक्ष्यों को अलग करने के लिए अर्धविराम या अल्पविराम का प्रयोग करें, या प्रत्येक लक्ष्य को अलग से निर्दिष्ट करें।/टी भी स्वीकार्य है। उदाहरण के लिए: /लक्ष्य: संसाधन; संकलित

+7

समस्या यह निर्दिष्ट कर रही है कि प्रत्येक लक्ष्य के साथ क्या करना है: बिल्ड, पुनर्निर्माण, साफ करें। समस्या का एक हिस्सा यह है कि "लक्ष्य" शब्द का उपयोग कमांड लाइन पर msbuild फ़ाइल के भीतर एक लक्ष्य निर्दिष्ट करने के लिए किया जाता है, और फिर यह निर्दिष्ट करने के लिए कि कौन सी प्रोजेक्ट एक समाधान फ़ाइल (नेमस्पेस टकराव) के भीतर निर्माण करना है। –

0

CheGueVerra के टेम्पलेट का उपयोग करना, मैं निम्नलिखित समाधान के साथ आया था

<!-- Build the 'bar' project only --> 
<Target Name="Baz"> 
    <MSBuild Projects="Foo.sln" Targets="bar$(ProjBuildCmd)" /> 
</Target> 

<!-- Build the whole solution --> 
<Target Name="Baz2"> 
    <MSBuild Projects="Foo.sln" Targets="$(SolnBuildCmd)" /> 
</Target> 
+1

यह समाधान वीएस 10 के लिए काम नहीं कर रहा है । क्या आपके पास इस पर कोई अपडेट है? – Mike

2

कुंजी conditionalize है BuildCmd संपत्ति।

<Target Name="Baz"> 
    <PropertyGroup> 
    <BuildCmd Condition="'$(BuildCmd)' != ''">:$(BuildCmd)</BuildCmd> 
    </PropertyGroup> 
    <MSBuild Projects="Foo.sln" Targets="bar$(BuildCmd)" /> 
</Target> 

इस तरह, यदि स्वच्छ या पुनर्निर्माण सेट किया गया है, तो कोलन जोड़ा जाता है। यदि कुछ भी जोड़ा नहीं गया है, तो BuildCmd बस खाली हो जाएगा, बिल्ड लक्ष्य पर डिफ़ॉल्ट।

नोट - संपत्ति समूह को लक्ष्य में रहना चाहिए, या जब आप इसे कमांड लाइन पर निर्दिष्ट करते हैं तो यह अधिक हो जाएगा।

संबंधित मुद्दे