msbuild का उपयोग कर एक समाधान की परियोजना फ़ाइल निर्दिष्ट करें


116

मैं msbuild का उपयोग करके समाधान की एक विशेष परियोजना के निर्माण के लिए कमांडलाइन चाहता हूं जैसे हम devenv.com के साथ करते हैं। devenv.com में हम निम्नलिखित कमांडलाइन का उपयोग करके समाधान की एक परियोजना निर्दिष्ट कर सकते हैं

devenv.com /Build Release|x86 test.sln /project "testproject"

उपरोक्त कमांडलाइन का उपयोग करके मैं testproject को test.sn में बना सकता है devenv.com का उपयोग कर। क्या एक ही समाधान के लिए msbuild के लिए कमांडलाइन है।

धन्यवाद


किसी भी कारण से आप केवल टेस्टप्रोजेक्ट को ही नहीं बना रहे हैं?
मार्क स्मिथ

2
चूंकि अब मैं अपनी टिप्पणी संपादित नहीं कर सकता। मेरा मतलब है कि समाधान के बजाय सीधे परियोजना का संदर्भ है। "msbuild testproject / p: कॉन्फ़िगरेशन = रिलीज़ / पी: प्लेटफ़ॉर्म = x86"
मार्क स्मिथ

अलग-अलग समय मुझे अलग-अलग परियोजनाओं का निर्माण करना है।
devenv.com

यदि आपके पास एकमात्र मुद्दा है, तो आपको सही समय पर आवश्यक परियोजनाओं के निर्माण के लिए msbuild का उपयोग करने में सक्षम होना चाहिए। आपके पास पहले से ही समाधान पर अलग-अलग समय पर आपके पास अलग-अलग कमांड निष्पादित होते हैं, इसलिए केवल अलग-अलग msbuild आदेशों के साथ उचित समय पर परियोजनाओं का संदर्भ क्यों न दें? यदि आपकी परियोजनाएं सही ढंग से स्थापित की गई हैं, तो उन्हें स्लन फ़ाइल का उपयोग किए बिना अपने सभी संदर्भों का पता लगाना चाहिए।
मार्क स्मिथ

जवाबों:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

ध्यान दें कि क्या सौंपा गया है /t समाधान में प्रोजेक्ट का नाम , यह प्रोजेक्ट फ़ाइल नाम से अलग हो सकता है।

इसके अलावा, जैसा कि कहा गया है: MSBuild.exe का उपयोग करके समाधान में विशिष्ट लक्ष्य बनाएं :

इस परियोजना का नाम वर्णों के किसी भी मौजूद होता है तो %, $, @, ;, ., (, ), या ', उन्हें एक साथ बदलें _निर्दिष्ट लक्ष्य नाम पर।

आप एक साथ कई प्रोजेक्ट भी बना सकते हैं:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

पुनर्निर्माण या स्वच्छ, परिवर्तन करने के लिए /t:projectकरने के लिए /t:project:cleanया/t:project:rebuild


99
एक महत्वपूर्ण सूचना: यदि आपके प्रोजेक्ट में '।' नाम में, आपको इसे '_' से बदलने की आवश्यकता होगी, जब इसे / t के साथ निर्दिष्ट किया जाएगा
Watusimoto

4
@ कई परियोजनाओं के निर्माण के लिए, सिंटेक्स मेरे msbuild के /tलिए प्रत्येक परियोजना के निर्माण के लिए पैरामीटर को दोहराने के लिए था:msbuild test.sln /t:project /t:project2
फिलिप

46
इसके अलावा, यदि आप एक समाधान फ़ोल्डर का उपयोग कर रहे हैं, तो आपको फ़ोल्डर का नाम और स्लैश के साथ प्रोजेक्ट नाम को उपसर्ग करना होगा। जैसे @ उल्लेखुसीमोटो ऊपर उल्लेखित है, यदि आपके पास नाम में अवधि (!) है, तो आपको उन्हें अंडरस्कोर (_) से बदलना होगा। मैं कुछ इस तरह के साथ समाप्त हो गया: /t:SlnFolder\My_Project_name
ट्रैविस पार्क

28
@TravisParks: यह भी ध्यान देने योग्य हो सकता है कि "समाधान फ़ोल्डर" एक फ़ाइल सिस्टम फ़ोल्डर का उल्लेख नहीं करता है , बल्कि समाधान एक्सप्लोरर दृश्य में एक फ़ोल्डर है।
joshbodily

4
मुझे फ़ोल्डर नाम (GYP जनरेट प्रोजेक्ट्स) में '_' के साथ '(' और ')' को भी बदलना पड़ा। मुझे लगता है कि यह सभी विशेष पात्रों को अंडरस्कोर से बदल दिया जाता है।
मैक्सिम वायार्गस

15

MSBuild वास्तव में समाधान नहीं परियोजनाओं के उपयोग के माध्यम से काम करता है। समाधान का उपयोग केवल MSBuild में आंतरिक रूप से एक अस्थायी परियोजना फ़ाइल में पार्स करने के लिए किया जाता है। आपको निम्नलिखित कमांड को निष्पादित करके MSBuild के माध्यम से सीधे ब्याज की परियोजना का निर्माण करने में सक्षम होना चाहिए।

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

एक प्रमुख मुद्दा है जो मुझे पता है कि आप समाधान के बजाय सीधे परियोजना का उपयोग कर सकते हैं: यदि आप परियोजनाओं के बीच निर्भरता व्यक्त करने के लिए समाधान का उपयोग करते हैं, तो परियोजना के संदर्भों को जोड़ने और निर्माण प्रणाली को स्वचालित रूप से निर्भरता से बाहर काम करने दें। ।

यदि आप sln फ़ाइल का उपयोग करके एक बिल्ड ऑर्डर लागू कर रहे हैं, तो मैं उन निर्भरता को सीधे proj फाइलों में काम करने और उन्हें sln से हटाने की सलाह देता हूं। यह आपको सीधे MSBuild से किसी भी प्रॉजेक्ट फ़ाइल को लागू करने की अनुमति देगा और परियोजनाएं बिना किसी अतिरिक्त कार्य के सभी स्वतंत्र रूप से बनाएंगी। आपको वास्तव में sln फ़ाइल को प्रोजेक्ट्स के समूह के रूप में विज़ुअल स्टूडियो में काम करना आसान बनाना चाहिए न कि बिल्ड इनपुट के रूप में।


4
कृपया इस बात की ओर ध्यान दें कि कैसे निर्माण आदेश को प्रोज फाइलों से लागू किया जा सकता है। धन्यवाद।
प्रोग्रामकप

4
यहाँ सीधे प्रोजेक्ट नाम का उपयोग करने के साथ एक और समस्या है। उदाहरण के लिए, आपके समाधान में 5 परियोजनाएँ हैं। कुछ परियोजनाओं में डिबगप्रो कॉन्फ़िगरेशन और अन्य परियोजनाएं नहीं हैं। यदि आप कॉन्फ़िगरेशन के साथ कोई प्रोजेक्ट बनाते हैं, जिसमें सभी प्रोजेक्ट्स सब कुछ फ़ाइल हैं, लेकिन केवल समाधान फ़ाइल पता है कि यदि आपने समाधान कॉन्फ़िगरेशन डीबगप्रो को चुना है, तो प्रत्येक प्रोजेक्ट के लिए किस प्रोजेक्ट कॉन्फ़िगरेशन का उपयोग करना है।
एलेक्स

@ProgramCpp जब आप एक परियोजना से दूसरे में संदर्भ जोड़ते हैं, तो यह स्वचालित रूप से यह पता लगाता है कि संदर्भित परियोजना को पहले बनाने की आवश्यकता है।
jpaugh

इस दृष्टिकोण का एक और नुकसान यह है कि परियोजना में सापेक्ष पथ को समाधान फ़ाइल के सापेक्ष हल किया जाता है। एक बार जब आप प्रोजेक्ट बनाते हैं तो सीधे सापेक्ष पथ बदल जाएगा। आउटपुट कहीं और हो सकता है और यूनिट परीक्षण गलत निर्देशिकाओं को देख सकते हैं।
टॉमस क्यूब्स

यदि आप प्रोजेक्ट कॉन्फ़िगरेशन में समाधान चर का उपयोग करते हैं तो समस्याएँ भी दिखाई दे सकती हैं, जैसे $ (SolutionDir)
Alex Che

8

भावी साधकों के लिए जानकारी के रूप में पोस्टिंग

बिल्ड स्क्रिप्ट में निम्न जोड़ें और इसे एक बार चलाएं। यह सटीक लक्ष्य और अन्य जानकारी उत्पन्न करेगा जो msbuild वास्तव में उपयोग करेगा।

Ex: यदि आपके पास .प्रोजेक्ट का नाम या फ़ोल्डर है, तो msbuild के _स्थान पर उम्मीद होगी .

set MSBuildEmitSolution=1

जानकारी प्राप्त करने के बाद आवश्यक विवरण के साथ बिल्ड स्क्रिप्ट को अपडेट करें।


6
`अगर आपके पास है। ' परियोजना का नाम या फ़ोल्डर msbuild '' के स्थान पर '_' की अपेक्षा करेगा। ''
dhcgn

2

ऐसा करने के लिए, आपको यह जानना होगा कि परियोजना का लक्ष्य-नाम क्या है, जरूरी नहीं कि परियोजना का नाम ही हो।

इसका पता लगाने का एक तरीका अपने एसएलएन के खिलाफ MSBuild का उपयोग करना है जिसका उद्देश्य एक विशेष पर्यावरण चर सेट करने के बाद इच्छित मानदंड के साथ MSBuildEmitSolutionहै 1

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

मुझे हाल ही में नेस्टेड डायरेक्ट्रीज़ में लक्ष्य के लिए एक बहुत ही विशिष्ट नाम के कारण ऐसा करना पड़ा। तो मेरी उत्पन्न फ़ाइल से, my_stuff.sln.metaprojमुझे यह पंक्ति मिली:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

इसका मतलब है कि कमांड-लाइन का उपयोग समाप्त होता है,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
मुझे यही चाहिए था। यदि आप इसे चलाना नहीं चाहते हैं तो संकेत दें: आपका लक्ष्य मौजूदा पथ से आपकी प्रोजेक्ट फ़ाइल तक फ़ोल्डर संरचना है, प्रोजेक्ट फ़ाइल एक्सटेंशन ( .csprojमेरे मामले में) घटाता है। I <3 SO!
कोई रिफंड नहीं रिटर्न

1

बस अतिरिक्त जानकारी जोड़ने के लिए, प्रोजेक्ट फ़ोल्डर में msbuild को निष्पादित करना डिफ़ॉल्ट रूप से प्रोजेक्ट फ़ाइल का निर्माण करेगा क्योंकि इसके केवल एक ही है।

>msbuild

इस तरह msbuild का उपयोग करने के कई रूप हैं। आप सीधे प्रोज फाइल को निर्दिष्ट कर सकते हैं।

>msbuild helloworld.csproj -t:Build.

उपयोग के लिए msbuild प्रलेखन की समीक्षा करें, फ़ाइल आवश्यकताओं के साथ ही समाधान के बजाय परियोजना के निर्माण के लाभ।

एमएस MSBuild प्रलेखन

इस तरह से निर्माण करने के फायदे हैं जैसा कि ऊपर दिए गए निशान-स्मिथ द्वारा उल्लेख किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.