2013-07-05 2 views
8

मेरा प्रश्न another one पर आधारित है, लेकिन मैं विपरीत करना चाहता हूं: msbuild को एक विशिष्ट msbuild चेतावनी को दबाने के बजाय चेतावनी का इलाज करने के लिए बताएं।मैं एमएसबी 3245 (संदर्भ को हल नहीं कर सकता) चेतावनी को एक त्रुटि के रूप में कैसे देख सकता हूं?

हालांकि, अब तक मैं देखता हूं कि /p:WarningsAsErrors केवल सीएससी चेतावनियों और त्रुटियों में आता है। मैंने MSB को छोड़ने की कोशिश की और काम करने के लिए वहां क्या संख्या हो सकती है, लेकिन कोई भाग्य नहीं है।

क्या एमएसबिल्ड (कमांड लाइन) से एक त्रुटि के रूप में "असेंबली संदर्भ नहीं मिला" चेतावनी का इलाज करने का कोई तरीका है?

उत्तर

8

हाल ही में मुझे कुछ समान (कुछ लॉग इवेंट्स पर अभिनय) की आवश्यकता थी, लेकिन मुझे मुख्य रूप से एक साफ समाधान नहीं मिला क्योंकि मुझे पता नहीं चला कि एमएसबिल्ड प्रक्रिया में प्रोग्रामर्स को प्रोग्रामर्स तक कैसे पहुंचाया जाए। मैं हालांकि इस के साथ आया था, आपकी समस्या के लिए अनुकूलित सिद्धांत है: चेतावनी होती है

  • एक अगर

    • चेतावनी
    • निर्माण
    • एक स्थिर ध्वज सेट के लिए एक कस्टम लकड़हारा स्कैनिंग स्थापित कस्टम कार्य है कि झंडा जाँच करें और अगर यह

    पर है मुश्किल लग सकता है एक त्रुटि बढ़ा है, लेकिन कोड काफी सरल है:

    using Microsoft.Build.Framework; 
    using Microsoft.Build.Utilities; 
    
    namespace Foo 
    { 
        public static class Common 
        { 
        public static bool errorsOccurred = false; 
        } 
    
        public class ScanLogger : Logger 
        { 
        public override void Initialize(IEventSource eventSource) 
        { 
         eventSource.MessageRaised += (s, e) => 
         Common.errorsOccurred |= e.Message.Contains("MSB3245"); 
        } 
        } 
    
        public class CheckErrors : Task 
        { 
        public override bool Execute() 
        { 
         if(Common.errorsOccurred == false) 
         return true; 
         Log.LogError("errorsOccurred = true"); 
         return false; 
        } 
        } 
    } 
    

    यहाँ यह का उपयोग कर एक नमूना MSBuild स्क्रिप्ट है:

    <UsingTask TaskName="Foo.CheckErrors" AssemblyFile="Foo.dll"/> 
    
    <Target Name="MyBuild"> 
        <Message Text="MSB3245"/> <!-- simulate the build warning --> 
        <Foo.CheckErrors /> <!-- this will trigger an error --> 
    </Target> 
    

    और आप इसे इस तरह से आह्वान:

    msbuild /logger:Foo.dll my.proj 
    

    संपादित मैं सिर्फ फिर से इस जरूरत थी लेकिन मूल dll नहीं पा सके और न ही प्रोजेक्ट फ़ाइल इत्यादि - मुझे लगता है कि गिट में केवल कोड और सरलतम निर्देशों को संग्रहित करना और इसे आवश्यक होने पर इसे फ्लाई पर बनाना संभवतः क्लीनर है। फिर से इस कोशिश कर रहा: तो बुनियादी तौर पर कोड के ऊपर एक फ़ाइल customlogger.cs में कहीं अपनी निर्माण प्रक्रिया में स्टोर और फिर, प्रभावी रूप से कस्टम लकड़हारा साथ MSBuild लागू करने से पहले,

    <Target Name="BuildCustomLoggerDll"> 
        <Csc Sources="$(MSBuildThisFileDirectory)customlogger.cs" 
         References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll" 
         TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)CustomLogger.dll"/> 
    </Target> 
    

    अद्यतन का उपयोग कर टिप्पणी के जवाब में इसे बनाने आज मुझे यकीन नहीं है कि मूल कोड वास्तव में कभी भी काम करता है (ठीक है, यह नमूना संदेश दिखाता है लेकिन वास्तविक चेतावनी MSB3245 के लिए नहीं), क्योंकि यह केवल संदेश ईवेंट को हुक करता है, जबकि ResolveAssemblyReference एक वास्तविक चेतावनी ईवेंट उत्सर्जित करता है और इसके अलावा चेतावनी संख्या भी होती है आमतौर पर संदेश में निहित नहीं है।

    public class ScanLogger : Logger 
    { 
        public override void Initialize(IEventSource eventSource) 
        { 
        eventSource.WarningRaised += (s, e) => Common.errorsOccurred |= e.Code == "MSB3245"; 
        } 
    } 
    
  • +0

    नहीं है वहाँ जोड़ने के लिए एक रास्ता है परियोजना स्तर के बजाय समाधान स्तर पर यह प्रक्रिया? – Maslow

    +0

    असल में आप इस तर्क को एक सामान्य फ़ाइल में परिभाषित करेंगे और फिर प्रत्येक प्रोजेक्ट में उस फ़ाइल को आयात करेंगे। समाधान समाधान पर स्वचालित रूप से ऐसा करने का सबसे अच्छा तरीका सुनिश्चित नहीं है, हालांकि कुछ ऐसा हो सकता है: http://stackoverflow.com/questions/18249027/import-targets-file-from-command-line-in-msbuild या http : //dotnet.geir-sorensen.net/2010/04/msbuild-custom-targets.html – stijn

    +0

    @stijn मैं इस कोड का उपयोग कर रहा हूं, और इसे आपके उदाहरण के साथ काम कर रहा हूं (जहां मैं कृत्रिम रूप से एमएसबी 3245 वाला संदेश भेजता हूं)। हालांकि, जब मैं इसे वास्तविक के लिए चलाता हूं, तो ऐसा कोई संदेश नहीं आता है। मैं इस लॉगजर द्वारा प्राप्त प्रत्येक संदेश को लॉगिंग कर रहा हूं (और फ़ाइल में), और कोई रोचक व्यक्ति नहीं आ रहा है (चेतावनियों के साथ)। मैंने eventSource.AnyEventRaised और eventSource.WarningRaised में भी हुक करने की कोशिश की, लेकिन उनके पास चेतावनी नहीं है जिसे मैं ढूंढने की कोशिश कर रहा हूं। ऐसा लगता है कि व्यवहार बदल गया है। – fastmultiplication

    1

    ऐसा लगता है कि इस चेतावनी के साथ जुड़े संदेश यह है कि एक चेतावनी नहीं है:

    इस संदर्भ अपने कोड के लिए आवश्यक है, तो आप संकलन मिल सकता है त्रुटियों

    यह चाल हालांकि करता है

    , काफी सही नहीं है। यदि अनुपलब्ध संदर्भ एक WPF विषय है, तो आपको रन-टाइम त्रुटि (System.IO) मिलेगा।FileNotFoundException) इसके बजाए।

    एक अलग रूप में, यदि आप विशेष रूप से MSB3245 के लिए देखो आप प्राप्त करेंगे:

    सीएससी: चेतावनी CS1691: 'MSB3245' मान्य चेतावनी संख्या

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

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