2012-02-14 20 views
9

यह कहने के लिए एक त्वरित अग्रदूत है कि मैंने सामान्य रूप से फ़ोरम और नेट के आसपास सामान्य खोज की है, और मैंने इस मंच पर कहीं और सुझावों का कोई फायदा नहीं लिया है।NuGet पैकेज से स्टाइलकॉप MSBUILD कार्यान्वित करना

मेरी समस्या यह है कि मेरी कंपनी स्टाइलकॉप, रीशेपर और जेएसलिंट (आदि इत्यादि) जैसे उपकरणों के उपयोग के साथ आंतरिक स्वचालित पीयर-समीक्षा (पाठ्यक्रम की सीमा तक) को लागू करने की तलाश में है।

हम अपने आंतरिक NuGet पैकेज रिपोजिटरी (फ़ीड) के खिलाफ एक कस्टम NuGet पैकेज का उपयोग कर रहे हैं ताकि हमारे डेवलपर्स को टूल की एक प्रशासित रिलीज मिल सके (यानी जब तक इसकी समीक्षा और रिलीज़ होने तक यह नवीनतम स्टाइलकॉप डाउनलोड नहीं हो जाता है) हमारे कस्टम नियमों के अतिरिक्त (स्टाइलकॉप सेटिंग्स फ़ाइल) के साथ। चूंकि हम बिल्ड टाइम पर त्रुटियों को हाइलाइट करने के लिए स्टाइलकॉप MSBUILD कार्यों का उपयोग करना चाहते हैं, स्टाइलकॉप के लिए असेंबली सटीक होने की आवश्यकता है और इसलिए हम NuGet रिलीज के पक्ष में C: \ Program Files \ version के इंस्टॉलेशन को रद्द कर रहे हैं।

मैंने एक NuGet पैकेज बनाने में कामयाब रहा है जो एक प्रोजेक्ट (क्लास लाइब्रेरी, वेब साइट इत्यादि) में स्थापित करता है, अनुमोदित स्टाइलकॉप असेंबली (StyleCop.dll, StyleCop.CSharp.dll और StyleCop.CSharpRules.dll) की प्रतिलिपि बनाता है। , Settings.StyleCop और पैकेज फ़ोल्डर में StyleCop.Targets, और .csproj फ़ाइल को संशोधित करता है निम्नलिखित नोड्स (यह सिर्फ पाठ्यक्रम का एक टुकड़ा) शामिल करने के लिए:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup Condition=" '$(Configuration)' != 'Debug' "> 
     <StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 

    <Import Project="$(SolutionDir)\packages\NuGetPackageName.1.0.0\StyleCop.Targets" /> 
</Project> 

मैं StyleCop सी के रूप में स्थापित किया है: \ Program फ़ाइलें \ और सी: \ प्रोग्राम फ़ाइलें \ MSBUILD तब सबकुछ काम करता है, लेकिन इस विधि का उपयोग स्टाइलकॉप। लक्ष्य सही ढंग से काम नहीं कर रहा है। यह उपयोग किया जा रहा है क्योंकि विजुअल स्टूडियो 2010 त्रुटियों को फेंक देता है अगर फ़ाइल हटा दी जाती है और यह StyleCop.Cache फ़ाइल बनाता है। StyleCop.Targets फ़ाइल को NuGet पैकेज फ़ोल्डर में स्थानीय DLL पर इंगित करने के लिए बदल दिया गया है, और मैंने कुछ अलग-अलग प्रयास किए हैं। मानक स्टाइलकॉप एक (सापेक्ष फ़ाइलपाथ परिवर्तनों के साथ) सहित लक्ष्य फ़ाइलें। यहां तक ​​कि यदि मैं स्थानीय रूप से MSBUILD गुणों को ओवरराइड करता हूं, तो यह काम नहीं करता है, जैसे ओवरराइडसेटिंगफ़ाइल।

StyleCop.Targets फ़ाइल इस वर्तमान की तरह दिखता है:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Specify where tasks are implemented. --> 
    <UsingTask AssemblyFile="$(SolutionDir)\packages\NuGetPackageName.1.0.0\lib\net40\StyleCop.dll" TaskName="StyleCopTask"/> 

    <PropertyGroup> 
     <BuildDependsOn>$(BuildDependsOn);StyleCop</BuildDependsOn> 
     <RebuildDependsOn>StyleCopForceFullAnalysis;$(RebuildDependsOn)</RebuildDependsOn> 
    </PropertyGroup> 

    <!-- Define StyleCopForceFullAnalysis property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisForceFullAnalysis)' != '') and ('$(StyleCopForceFullAnalysis)' == '')"> 
     <StyleCopForceFullAnalysis>$(SourceAnalysisForceFullAnalysis)</StyleCopForceFullAnalysis> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopForceFullAnalysis)' == ''"> 
     <StyleCopForceFullAnalysis>false</StyleCopForceFullAnalysis> 
    </PropertyGroup> 

    <!-- Define StyleCopCacheResults property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisCacheResults)' != '') and ('$(StyleCopCacheResults)' == '')"> 
     <StyleCopCacheResults>$(SourceAnalysisCacheResults)</StyleCopCacheResults> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopCacheResults)' == ''"> 
     <StyleCopCacheResults>true</StyleCopCacheResults> 
    </PropertyGroup> 

    <!-- Define StyleCopTreatErrorsAsWarnings property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisTreatErrorsAsWarnings)' != '') and ('$(StyleCopTreatErrorsAsWarnings)' == '')"> 
     <StyleCopTreatErrorsAsWarnings>$(SourceAnalysisTreatErrorsAsWarnings)</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopTreatErrorsAsWarnings)' == ''"> 
     <StyleCopTreatErrorsAsWarnings>true</StyleCopTreatErrorsAsWarnings> 
    </PropertyGroup> 

    <!-- Define StyleCopEnabled property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisEnabled)' != '') and ('$(StyleCopEnabled)' == '')"> 
     <StyleCopEnabled>$(SourceAnalysisEnabled)</StyleCopEnabled> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopEnabled)' == ''"> 
     <StyleCopEnabled>true</StyleCopEnabled> 
    </PropertyGroup> 

    <!-- Define StyleCopOverrideSettingsFile property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisOverrideSettingsFile)' != '') and ('$(StyleCopOverrideSettingsFile)' == '')"> 
     <StyleCopOverrideSettingsFile>$(SourceAnalysisOverrideSettingsFile)</StyleCopOverrideSettingsFile> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopOverrideSettingsFile)' == ''"> 
     <StyleCopOverrideSettingsFile> </StyleCopOverrideSettingsFile> 
    </PropertyGroup> 

    <!-- Define StyleCopOutputFile property. --> 
    <PropertyGroup Condition="('$(SourceAnalysisOutputFile)' != '') and ('$(StyleCopOutputFile)' == '')"> 
     <StyleCopOutputFile>$(SourceAnalysisOutputFile)</StyleCopOutputFile> 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(StyleCopOutputFile)' == ''"> 
     <StyleCopOutputFile>$(IntermediateOutputPath)StyleCopViolations.xml</StyleCopOutputFile> 
    </PropertyGroup> 

    <!-- Define all new properties which do not need to have both StyleCop and SourceAnalysis variations. --> 
    <PropertyGroup> 
     <!-- Specifying 0 will cause StyleCop to use the default violation count limit. 
     Specifying any positive number will cause StyleCop to use that number as the violation count limit. 
     Specifying any negative number will cause StyleCop to allow any number of violations without limit. 
    --> 
     <StyleCopMaxViolationCount Condition="'$(StyleCopMaxViolationCount)' == ''">0</StyleCopMaxViolationCount> 
    </PropertyGroup> 

    <!-- Define target: StyleCopForceFullAnalysis --> 
    <Target Name="StyleCopForceFullAnalysis"> 
     <CreateProperty Value="true"> 
      <Output TaskParameter="Value" PropertyName="StyleCopForceFullAnalysis" /> 
     </CreateProperty> 
    </Target> 

    <!-- Define target: StyleCop --> 
    <Target Name="StyleCop" Condition="'$(StyleCopEnabled)' != 'false'"> 
     <Message Text="Forcing full StyleCop reanalysis." Condition="'$(StyleCopForceFullAnalysis)' == 'true'" Importance="Low" /> 

     <!-- Determine what files should be checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. --> 
     <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' != 'true') and ('%(Compile.ExcludeFromSourceAnalysis)' != 'true')"> 
      <Output TaskParameter="Include" ItemName="StyleCopFiles"/> 
     </CreateItem> 

     <Message Text="Analyzing @(StyleCopFiles)" Importance="Low" /> 

     <!-- Show list of what files should be excluded. checked. Take all Compile items, but exclude those that have set ExcludeFromStyleCop=true or ExcludeFromSourceAnalysis=true. --> 
     <CreateItem Include="@(Compile)" Condition="('%(Compile.ExcludeFromStyleCop)' == 'true') or ('%(Compile.ExcludeFromSourceAnalysis)' == 'true')"> 
      <Output TaskParameter="Include" ItemName="StyleCopExcludedFiles"/> 
     </CreateItem> 

     <ItemGroup> 
      <StyleCopFiles Remove="@(ExcludeFromStyleCop)" /> 
     </ItemGroup> 

     <Message Text="Excluding @(StyleCopExcludedFiles)" Importance="Normal" /> 

     <!-- Run the StyleCop MSBuild task. --> 
     <StyleCopTask ProjectFullPath="$(MSBuildProjectDirectory)" SourceFiles="@(StyleCopFiles)" 
        AdditionalAddinPaths="@(StyleCopAdditionalAddinPaths)" ForceFullAnalysis="$(StyleCopForceFullAnalysis)" 
        DefineConstants="$(DefineConstants)" TreatErrorsAsWarnings="$(StyleCopTreatErrorsAsWarnings)" 
        CacheResults="$(StyleCopCacheResults)" OverrideSettingsFile="$(StyleCopOverrideSettingsFile)" 
        OutputFile="$(StyleCopOutputFile)" MaxViolationCount="$(StyleCopMaxViolationCount)" /> 

     <!-- Make output files cleanable --> 
     <CreateItem Include="$(StyleCopOutputFile)"> 
      <Output TaskParameter="Include" ItemName="FileWrites"/> 
     </CreateItem> 

     <!-- Add the StyleCop.cache file to the list of files we've written - so they can be cleaned up on a Build Clean. --> 
     <CreateItem Include="StyleCop.Cache" Condition="'$(StyleCopCacheResults)' == 'true'"> 
      <Output TaskParameter="Include" ItemName="FileWrites"/> 
     </CreateItem> 
    </Target> 
</Project> 

किसी को भी पता है कि कैसे मैं इस काम के मिल सकता है? विजुअल स्टूडियो 2010 आउटपुट विंडो में कोई संदेश नहीं दिखाता है।

चीयर्स सब!

+4

एफवाईआई मैंने लिब संदर्भ के बजाए बिल्ड स्क्रिप्ट के साथ स्टाइलकॉप.एमएसबिल्ड नुगेट पैकेज को अभी प्रकाशित किया है। Https://nuget.org/packages/StyleCop.MSBuild –

उत्तर

7

मैं उस समाधान को पोस्ट कर रहा हूं जो मैं किसी भी स्थिति में किसी के लिए आया था।

सबसे पहले मैं पीछा किया डिबगिंग MSBuild कार्यों पर इस उत्कृष्ट गाइड है, जो मदद की मुझे तर्क और चर के कुछ बाहर लौह करने के लिए:

http://blogs.msdn.com/b/visualstudio/archive/2010/07/06/debugging-msbuild-script-with-visual-studio.aspx

इस के बाद मैं StyleCopViolations.xml जो मेरे में था जाँच/ओबीजे/डीबग/फ़ोल्डर। हालांकि यह हमेशा वापस आ 0 परिणाम नहीं, केवल निम्न XML के साथ:

<StyleCopViolations/> 

मैं इस पर कुछ शोध किया और पाया कि मैं अपने NuGet/lib/net40/के साथ फ़ोल्डर में StyleCop.CSharpRules.dll शामिल करने के लिए की जरूरत StyleCop.dll, StyleCop.CSharp.dll और StyleCop.Settings फ़ाइलें।

मेरी परियोजना को उपरोक्त किसी भी विधानसभा के संदर्भों की आवश्यकता नहीं थी, लेकिन मुझे एहसास हुआ कि मेरे NuGet पैकेज में StyleCop NuGet पैकेज पर निर्भरता थी जिसमें StyleCop.CSharpRules.dll शामिल नहीं था।

इस असेंबली को जोड़ने के बाद भी मैं 0 परिणाम देख रहा था, इसलिए मैंने स्टाइलकॉप सी: \ प्रोग्राम फ़ाइलें \ StyleCop \ इंस्टॉलर (कोडप्लेक्स से) के एक नए इंस्टॉलेशन से सभी 3 असेंबली का मैन्युअल ओवरराइड किया। । NuGet पैकेज असेंबली ओवरराइट करने के बाद यह काम करना शुरू कर दिया!

तो लपेटने के लिए, अपने एमएसबिल्ड (इस पोस्ट के शीर्ष पर दिए गए लिंक के साथ) डीबग करें और अभी तक NuGet पैकेज का उपयोग न करें!

चीयर्स

+1

Argh देखें ... समाधान के लिए धन्यवाद! मैंने अपना खुद का परिदृश्य बनाने के लिए 'NuGet' पैकेज' 'StyleCop'' से 'स्टाइलकॉप'' का उपयोग करने का प्रयास किया है, लेकिन यह कुछ भी नहीं किया। समस्या 'StyleCop.CSharpRules.dll' गायब होने में थी। फिर मैंने "StyleCop.MSBuild'" 'NuGet' पैकेज पर स्विच किया, जिसमें 'StyleCop.CSharpRules.dll' शामिल है, और अब सब कुछ ठीक काम करता है! –

2

उपयोग StyleCop.MSBuild बजाय StyleCop के रूप में दिमित्री Lobanov ने सुझाव दिया।

i.e पैकेज प्रबंधक कंसोल में install-package stylecop.msbuild कमांड का उपयोग करें।

0

आप और StyleCop.Error.MSBuild त्रुटियों के रूप में StyleCop चेतावनी सक्षम करने के लिए nuget संकुल के संयोजन StyleCop.MSBuild उपयोग कर सकते हैं।

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