2013-07-08 6 views
37

यह करने के लिए स्पष्ट किया जाना चाहिए के रूप में सभी चेतावनियों मानें, लेकिन मैं सिर्फ यह काम नहीं कर सकता है ...त्रुटियों

मुझे क्या करना कोशिश कर रहा हूँ सरल है: मैं के साथ विफल करने के लिए अपने संकलन चाहते हैं अगर कोई चेतावनी है तो एक त्रुटि। अब तक तो

<TreatWarningsAsErrors>true</TreatWarningsAsErrors> 

: हाँ, प्रसिद्ध TreatWarningsAsErrors ...

मैं इसे अपने सी # परियोजना गुण

treat warnings as errors

यह मेरा csproj में अपवादित TreatWarningsAsErrors अनुभाग में जो परिणाम पर कॉन्फ़िगर अच्छा, अगर मैं अपने कोड में एक बेकार private चर जोड़ता हूं, तो इसके परिणामस्वरूप संकलन त्रुटि होती है:

private int unused; 

Error 3 Warning as Error: The field 'XXXX.unused' is never used

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

अंत में, मैं, इसलिए TFS एक प्रतिबद्ध मामले में एक है अस्वीकार होगा एक सुरक्षा पूर्ण चेक-इन TFS कॉन्फ़िगर करने के लिए विन्यास का निर्माण कोशिश कर रहा हूँ "संदर्भित घटक 'XXXX' नहीं पाया जा सका।" चेतावनी। बिल्ड प्रक्रिया टेम्पलेट को संशोधित करने से कुछ आसान होगा।

+2

डुप्लिकेट की तरह है: http ://स्टैक ओवरफ़्लो।com/प्रश्न/17495278/कैसे-कर सकते हैं-ए-इलाज-msb3245 चेतावनी के रूप में एक-त्रुटि/17,515,854 # 17,515,854 – stijn

+0

एक पोस्ट का निर्माण कदम है कि चेतावनी – jeffo

उत्तर

17

सीएससी चेतावनियों के विपरीत एमएसबिल्ड चेतावनियां (सभी एमएसबी * के साथ शुरू होती हैं) को दबाया नहीं जा सकता है और न ही त्रुटियों में प्रचारित किया जा सकता है। कारण ResolveAssemblyReference कार्य अपने संदेशों को फ्लाई पर प्रिंट करता है और उनमें से कोई भी एकत्र नहीं करता है।

एकमात्र व्यवहार्य समाधान टीएफएस निर्माण के दौरान बनाई गई एमएसबिल्ड लॉग फ़ाइलों को पढ़ रहा है। मुझे लगता है कि कस्टम बिल्ड CodeActivity को लागू करने का सबसे सुरुचिपूर्ण समाधान है। निम्नलिखित एक सरल गतिविधि है कि होगा परिणाम के लिए उत्पादन किसी भी फ़ाइल के एक SearchString दिया:

using System; 
using System.Activities; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using Microsoft.TeamFoundation.Build.Client; 

namespace MyBuildActivities.FileSystem 
{ 
    [BuildActivity(HostEnvironmentOption.Agent)] 
    public sealed class ReadStringFromFile : CodeActivity 
    { 
     [RequiredArgument] 
     public InArgument<IEnumerable<string>> Files { get; set; } 

     [RequiredArgument] 
     public InArgument<string> SearchString { get; set; } 

     public OutArgument<string> Result { get; set; } 

     protected override void Execute(CodeActivityContext context) 
     { 
      var files = context.GetValue(Files); 
      var searchString = context.GetValue(SearchString); 

      var list = 
       (files.Where(file => File.ReadAllText(file).Contains(searchString)) 
        .Select(file => string.Format("{0} was found at {1}", searchString, file))).ToList(); 

      if(list.Count > 0) 
       Result.Set(context, string.Join(Environment.NewLine, list)); 
     } 
    } 
} 

तो जैसे निर्माण प्रक्रिया टेम्पलेट में घोषित:

xmlns:cfs="clr-namespace:MyBuildActivities.FileSystem;assembly=MyBuildActivities" 

Compile and Test for Configuration अनुक्रम के अंत में सिर्फ लागू :

<Sequence DisplayName="Handle MSBuild Errors"> 
     <Sequence.Variables> 
       <Variable x:TypeArguments="scg:IEnumerable(x:String)" Name="logFiles" />                             
       <Variable x:TypeArguments="x:String" Name="readStringFromFileResult" /> 
     </Sequence.Variables> 
     <mtbwa:FindMatchingFiles DisplayName="Find Log Files" MatchPattern="[String.Format(&quot;{0}\**\*.log&quot;, logFileDropLocation)]" Result="[logFiles]" mtbwt:BuildTrackingParticipant.Importance="Low" /> 
     <cfs:ReadStringFromFile Files="[logFiles]" SearchString="MSB3245" Result="[readStringFromFileResult]" /> 
     <mtbwa:WriteBuildMessage DisplayName="Write Result" Message="[readStringFromFileResult]" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" /> 
     <If Condition="[readStringFromFileResult.Count > 0]" DisplayName="If SearchString Was Found" mtbwt:BuildTrackingParticipant.Importance="Low"> 
       <If.Then> 
          <Throw DisplayName="Throw Exception" Exception="[New Exception(readStringFromFileResult)]" mtbwt:BuildTrackingParticipant.Importance="Low" /> 
       </If.Then> 
     </If>                            
</Sequence> 

मैंने टीएफएस 2012 पर इसका परीक्षण किया है, हालांकि इसे टीएफएस 2010 के लिए भी काम करना चाहिए।

+0

निरीक्षण है यही कारण है कि मैं की ... मैं चेतावनी समझ में डर गया था की कोशिश करो एमएसबिल्ड से खुद को त्रुटियों में पदोन्नत नहीं किया जा सकता है। जो मुझे समझ में नहीं आता है वह क्यों है * अज्ञात असेंबली संदर्भ * एक सीएससी चेतावनी नहीं है। वैसे भी, एक कस्टम गतिविधि वास्तव में जाने के लिए, भले ही पहली नजर में यह (जाहिरा तौर पर) सरल उपयोग के मामले मैं था के लिए overkill की तरह एक सा लगता है तरीका है। +1, आपके उत्तर के लिए धन्यवाद। – ken2k

+0

मैं निम्नलिखित करना था समाधान KMoraz काम के द्वारा पोस्ट बनाने के लिए: 1. यदि स्ट्रिंग फ़ाइलों में नहीं मिला था CodeActivity में परिणाम की रिक्त स्ट्रिंग जोड़ें। 2. readStringFromFileResult को बदलें। बिल्ड टेम्पलेट में StringFromFileResult.Length पढ़ने के लिए गणना करें। अन्यथा जब स्ट्रिंग नहीं मिली तो मुझे एक शून्य अपवाद मिलेगा। – user1574808

3

एमएसबील्ड 15 अब /warnaserror ध्वज का समर्थन करता है, जो MSBuild चेतावनियों को त्रुटियों के रूप में माना जाता है।

MSBuild 15 विजुअल स्टूडियो 2017 के साथ intalled है लेकिन यह भी downloaded from GitHub

This GitHub issue हो सकता है यही कारण है कि यह एक MSBuild संपत्ति के माध्यम से सेट नहीं किया जा सकता है (tl; डॉ एक संपत्ति बहुत देर हो चुकी है)

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