2009-01-23 9 views
10

मैं एमएसबिल्ड विधानसभाओं में सीधे टैप करके एमएसबिल्ड को पावरशेल स्क्रिप्ट से चलाने पर विचार कर रहा हूं (एमएसबिल्ड इंस्टॉल पथ को देखने और बच्चों की प्रक्रिया के रूप में msbuild.exe को शुरू करने के विरोध में)।msbuild.exe प्रक्रिया spawning बिना PowerSll से MSBuild कैसे चलाएं?

क्या किसी ने ऐसा किया है? निर्माण चलाने के लिए सबसे सरल, सबसे सरल तरीका क्या होगा? क्या ऐसी तकनीक के लिए कोई पेशेवर/विपक्ष है जो आप इंगित करना चाहते हैं? (मुझे विशेष रूप से किसी भी समस्या में दिलचस्पी है जो एमएसबिल्ड को उसी प्रक्रिया/एपडोमेन में बाकी स्क्रिप्ट के रूप में चलाने से उत्पन्न हो सकती है)।

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') 
[void][Microsoft.Build.BuildEngine.Engine]::GlobalEngine.BuildProjectFile("path/main.proj") 

उत्तर

14

सबसे सरल एम्बेडेड-निर्माण आमंत्रण जो उत्पादन और उत्पादन आउटपुट था:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') 
$engine = New-Object Microsoft.Build.BuildEngine.Engine 
$engine.RegisterLogger((New-Object Microsoft.Build.BuildEngine.ConsoleLogger)) 
$engine.BuildProjectFile('fullPath\some.proj') 

हालांकि, यह पता चला है Powershell (V1) में सीधे MSBuild embedding समस्याग्रस्त है:

'MSBUILD : warning MSB4056: The MSBuild engine must be called on 
a single-threaded-apartment. Current threading model is "MTA". 
Proceeding, but some tasks may not function correctly.' 

क्यों ओह क्यों हम अभी भी 2009 में COM कर का भुगतान कर रहे हैं, जबकि किसी प्रबंधित परिवेश में काम कर रहे?

मेरा निष्कर्ष यह है कि पावरहेल (वी 1) में एमएसबिल्ड एम्बेड करना एक अच्छा विचार नहीं है।संदर्भ के लिए, मैं भी इस प्रक्रिया आधारित दृष्टिकोण शामिल कर रहा हूँ मैं का उपयोग कर समाप्त हो गया:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') 
$msbuild = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkFile("msbuild.exe", "VersionLatest") 
&$msbuild fullPath\some.proj 
3

एक अलग और संभवतः अधिक प्रयोग करने योग्य दृष्टिकोण एक MSBuild cmdlet बनाने के लिए होगा:

वर्तमान में मेरी सोच इन पंक्तियों के साथ कुछ न कुछ है। एमएसबिल्ड के पास एक अच्छा एपीआई है और सी #/वीबी जैसे संकलित भाषा से इसका उपयोग करने के तरीके पर कई नमूने हैं। एक cmdlet बनाने के लिए यह बहुत आसान होगा जो आपकी शक्तियों की स्क्रिप्ट के लिए एक बहुत अच्छा सिंटैक्स प्रदान करेगा।

+3

वैसे यह मेरा सवाल है - क्या आपके पास "इसका उपयोग करने के तरीके पर कई नमूने" हैं या अपना स्वयं का कोई लिंक है? –

5

मैं PSake पर बहुत अधिक सुझाव देना चाहता हूं।

मुझे उस पेज के एक हिस्से को उद्धृत करते हैं:

याद रखें कि psake PowerShell के आसपास वाक्यात्मक चीनी है। तो आप PowerShell में कुछ भी कर सकते हैं, आप psake में कर सकते हैं। इसका मतलब है कि आप एमएसबिल्ड, एनएएनटी, या अन्य स्क्रिप्ट चला सकते हैं। अपने वर्तमान निर्माण प्रणाली को पूरी तरह से बदलने की कोई आवश्यकता नहीं है। आप इसे स्वचालित करने और विस्तार करने के लिए psake का उपयोग कर सकते हैं!

psake स्वचालित रूप से .NET Framework के उचित संस्करण को अपने पथ में जोड़ता है। तो आप MSBuild, csc.exe, vbc.exe, या $ env में स्थापित किसी अन्य टूल तक पहुंच सकते हैं: पूरी तरह से योग्य पथ के बिना windir \ Microsoft.NET \ Framework \ $ version \।

+2

कृपया, 'एमएसबिल्ड बेकार पर दार्शनिक बहस में न जाएं, इसके बजाय पावरहेल-आधारित बिल्ड का उपयोग करें' क्योंकि यह वास्तव में मेरा प्रश्न नहीं था। –

+0

आप किस दार्शनिक बहस के बारे में बात कर रहे हैं? क्या आपने पृष्ठ पढ़ा था? यह MSBuild को लपेटने का एक आसान तरीका प्रदान करता है। – EBGreen

+0

हां, मैंने पृष्ठ पढ़ा था। और यह इस रेक-जैसे "नो एक्सएमएल ब्रैकेट टैक्स" बिल्ड टूल का वर्णन कर रहा है। मैंने msbuild पर स्विच करने से पहले रेक का उपयोग किया था और मैं वापस नहीं जा रहा हूं :-)। एमएसबिल्ड का आह्वान करने के लिए उपयोग कर रहे तंत्र भूकंप यह है कि यह इसे 'पथ' में जोड़ता है - यानी बाहरी प्रक्रिया। यह वही है जो मैं नहीं चाहता। –

3

मैं वही चीज़ ढूंढ रहा था। जेरेडपार के नेतृत्व के बाद मुझे निम्नलिखित मिला:

यह एक cmdlet बनाने के लिए एक तरीका है।

http://bartdesmet.net/blogs/bart/archive/2008/02/03/easy-windows-powershell-cmdlet-development-and-debugging.aspx

MSBuild एपीआई इन नामस्थान का हिस्सा है:

Microsoft.Build.Framework 

Microsoft.Build.BuildEngine 

और MSBuild प्रलेखन यहां पाया जा सकता है (यह अपने सवाल के जवाब में की तुलना में पूर्णता के लिए और अधिक है):

http://msdn.microsoft.com/en-us/library/wea2sca5.aspx

+0

धन्यवाद एंथनी, लेकिन कोड को शुद्ध पावरहेल से cmdlet तक ले जाना वास्तव में केवल प्रदर्शन/सुविधा अनुकूलन है। मुझे माइक्रोसॉफ्ट.बिल्ड.बिल्डइंजिन का उपयोग करने के लिए चरणों/कोड के साथ-साथ गॉथस में दिलचस्पी है। मैं वास्तविक रूप से ps1 और cmdlet के बीच वास्तविक इंपल को आसानी से स्थानांतरित कर सकता हूं। –

+0

मेरे पास कई अलग-अलग स्थानों में एमएसबिल्ड स्क्रिप्ट हैं, और मैं एक केंद्रीय स्थान से कुछ चलाने में सक्षम होना चाहता था। यदि आप एक कामकाजी उत्तर के साथ समाप्त होते हैं, तो मुझे ब्लॉग पोस्ट या कुछ देखना अच्छा लगेगा। –

+0

यह भी देखें http://stackoverflow.com/questions/78069/any-good-powershell-msbuild-tasks –

0

एक बार एक बार मैं चल रहा संवर्धित MSBuild प्रक्रियाओं का निर्माण के साथ खेल रहा है पर (जैसे, निर्माण के कुछ हिस्सों को छोड़ अधिक उग्रता के साथ)। इसके DLLs लोड करके अपनी खुद की प्रक्रिया में

  1. होस्ट MSBuild:

    वहाँ दो विकल्प थे।

  2. नियमित रूप से स्पॉन MSBuild.exe और फिर इसमें इंजेक्ट करें (उदा। लॉगर्स एक सभ्य तरीका प्रदान करते हैं)।

मैंने दोनों को लागू किया है और इसे # 1 छोड़ना पड़ा क्योंकि यह पर्याप्त लचीला नहीं था।

उदाहरण के लिए, एमएसबिल्ड के पास इसकी .config फ़ाइल में असेंबली बाध्यकारी पुनर्निर्देशन का एक भार है।

विजुअल स्टूडियो प्रक्रिया (devenv.exe) जो एमएसबिल्ड को अपने एपीआई के साथ होस्ट करता है, इसे अपने devenv.exe.config में कॉपी कॉपी कर देता है। मेरा .exe.config भी इन्हें प्राप्त करना था, लेकिन यह आपको एक विशिष्ट एमएसबिल्ड संस्करण का पालन करता है। और, ज़ाहिर है, आपको कॉन्फ़िगरेशन को संशोधित करना होगा। जो पीएस के साथ वास्तव में कोई विकल्प नहीं है, इसलिए मुझे संदेह है कि क्या आप वास्तव में स्थिर समाधान प्राप्त कर सकते हैं।