2009-07-06 12 views
10

मेरे पास एक समाधान है जिसे मैं टीएफएस पर निर्माण करने की कोशिश कर रहा हूं। मैं सभी उपयुक्त फाइलों के संस्करणों को अद्यतन करना चाहता हूं, और मैं इसे पूरा करने की कोशिश कर रहा हूं। इसे कैसे करें, इस पर बहुत सारे लिंक हैं, लेकिन उनमें से कोई भी मेरे लिए काम नहीं करता है, एक छोटी सी समस्या के कारण ... गुंजाइश।आइटम समूह आइटम गुंजाइश, वैकल्पिक रूप से "एमएसबिल्ड मुझसे नफरत क्यों करता है?"

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="DesktopBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <Target Name="DesktopBuild"> 
     <CallTarget Targets="GetFiles" /> 

     <Message Text="CSFiles: '@(CSFiles)'" /> 
    </Target> 

    <Target Name="GetFiles"> 
     <ItemGroup> 
      <CSFiles Include="**\AssemblyInfo.cs" /> 
     </ItemGroup> 
     <Message Text="CSFiles: '@(CSFiles)'" /> 
    </Target> 
</Project> 

मेरे पेड़ इस तरह दिखता है:

  • test.proj
  • application.sln
  • आवेदन (फ़ोल्डर)
    • main.cs
    • गुण (फ़ोल्डर)
      • AssemblyInfo.cs

जब मैं चलाने "c: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v3.5 \ MSBuild.exe test.proj" समाधान फ़ोल्डर से ... मैं मिल निम्नलिखित आउटपुट:

Microsoft (R) Build Engine Version 3.5.30729.1 
[Microsoft .NET Framework, Version 2.0.50727.3074] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 7/6/2009 3:54:10 PM. 
Project "D:\src\test.proj" on node 0 (default targets). 
    CSFiles: 'application\Properties\AssemblyInfo.cs' 
DesktopBuild: 
    CSFiles: '' 
Done Building Project "D:\src\test.proj" (default targets). 


Build succeeded. 
    0 Warning(s) 
    0 Error(s) 

Time Elapsed 00:00:00.04 

तो, मैं अपने आइटम समूह को वैश्विक दायरे कैसे बना सकता हूं? कंपाइलर और टीमबिल्ड द्वारा उपयोग की जाने वाली सभी लक्ष्य फाइलें वही काम करती हैं, और ये सभी वैश्विक हैं ... मुझे समझ में नहीं आता कि यह मेरे लिए क्यों काम नहीं कर रहा है।

कोई मदद?

+0

क्या आप test.proj फ़ाइल बनाने की कोशिश कर रहे हैं? मुझे यकीन नहीं है कि मैं समझता हूं कि आप प्रोजेक्ट फ़ाइल से बनाम असेंबली इन्फॉर्मेशन को क्यों निर्दिष्ट कर रहे हैं। –

+0

मैंने test.proj फ़ाइल को मेरी समस्या दिखाते हुए एक न्यूनतम उदाहरण के रूप में बनाया है। हकीकत में, मैं टीएफएस में अपनी एकाधिक समाधान फ़ाइल बनाने की कोशिश कर रहा हूं। यह केवल आइटम समूह और लक्ष्य में देख रहे स्कोपिंग व्यवहार को चित्रित करने के लिए है। –

+0

मेरी इच्छा है कि मैं मदद करने की कोशिश कर रहे सभी लोगों को उखाड़ फेंक सकता हूं, लेकिन स्पष्ट रूप से मैं भी 'newb' हूं। मैं बस एक नोट छोड़ना चाहता था कि मैं उस समय की सराहना करता हूं जब हर किसी ने यहां खर्च किया है, और इसके बारे में सोच रहा है। –

उत्तर

9

क्या आपने CallTarget के बजाय DependsOnTarget का उपयोग करने का प्रयास किया है? यह हो सकता है कि CallTarget दायरे के मुद्दे का कारण बन रहा है।

+0

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

+0

मैंने कोई नहीं देखा है। क्या आपने पूरी तरह से लक्ष्य के बाहर आइटम समूह को स्थानांतरित करने का प्रयास किया है? क्या ऐसा कोई कारण है जिसे आप ऐसा नहीं करना चाहते हैं? – technophile

+0

या इसे खाली करने के लिए प्रारंभ करें (शामिल करें = "*। WontExist" के साथ हैक करें) –

0

हम अपने निर्माण में कुछ ऐसा करते हैं। हम संस्करण को कमांड लाइन पैरामीटर के रूप में पास करते हैं।

हमारे TFSBuild.proj हम 0.0.0.0 के संस्करण स्थापित कर दें तो कोई संस्करण आपूर्ति की गई थी:

<!--Our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0--> 
<PropertyGroup> 
    <Version>0.0.0.0</Version> 
</PropertyGroup> 

<PropertyGroup> 
    <!--Used to ensure there is a newline before our text to not break the .cs files if there is no newline at the end of the file.--> 
    <newLine>%0D%0A</newLine> 

तो हम ऐसा करते हैं:

<Target Name="BeforeCompile"> 
    <!--Update our assembly version. Pass it in from the command prompt like this: /property:Version=1.0.0.0--> 

    <!--attrib needs to be run first to remove the read only attribute since files from tfs are read only by default.--> 
    <Exec Command='attrib -R $(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs' /> 

    <WriteLinesToFile File="$(SolutionRoot)\Source\Project\GlobalAssemblyInfo.cs" 
         Lines='$(newLine)[assembly: AssemblyVersion("$(Version)")]'/> 

</Target> 
+2

बस एफवाईआई, मौजूद नहीं करता है कि कोड ऐसा करने की अपेक्षा करता है। यह जांचने के लिए जांच करता है कि नामित फ़ाइल मौजूद है या नहीं, न कि नामित चर मौजूद है या नहीं। आप शायद शर्त = "$ (संस्करण) '==' '' चाहते हैं। Http://msdn.microsoft.com/en-us/library/7szfhaft.aspx – technophile

+0

देखें यह टेक्नोफाइल लड़का एक स्मार्ट है। :-) उसने क्या क़हा। डॉक्टर मानक तरीका एकल उद्धरणों से घिरा हुआ है और बहुत सारे सफेद जगह रखता है ... <संपत्ति समूह स्थिति = "$ (संस्करण) '==' '"> इसके अलावा, यह विधि मेरे लिए बहुत ही बढ़िया नहीं है । मैं फ़ाइलों को अद्यतन करने और regex अद्यतन करने के लिए MSBuild समुदाय कार्य विधियों को प्राथमिकता देता हूं। मेरी समस्या अद्यतन करने के लिए फ़ाइल सूची बनाने में है, क्योंकि मेरे पास गतिशील स्थान हैं। हालांकि धन्यवाद। :-) –

+0

धन्यवाद क्रिस। :) हम अपने सीआई पर्यावरण पर काम का एक गुच्छा करने के बीच में हैं, इसलिए यह मेरे दिमाग में बहुत ताजा है। ;) – technophile

5

पिछले टिप्पणीकार सही था, तो आप चाहिए CallTarget कार्य का उपयोग करने के बजाय DependsOnTargets का उपयोग करने के लिए इसे बदलें। आप जो देख रहे हैं वह bug एक स्कोपिंग इंस्यू नहीं है। way to avoid यह बग DependsOnTargets का उपयोग करना है (जो किसी भी तरह से बेहतर दृष्टिकोण है)।

सैयद इब्राहिम हाशिमी

मेरे पुस्तक: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

क्या यह वास्तव में एक बग है? स्पष्टीकरण [यहां] (http://blogs.msdn.com/b/aaronhallberg/archive/2007/07/16/msbuild-property-evaluation.aspx) समान रूप से आकर्षक है, और इस तथ्य से पुष्टि की जाती है कि यह है अभी भी यह कई वर्षों बाद कैसे काम करता है। –

+0

इसकी एक बग, कृपया http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspx देखें –

1

के रूप में कहा, तुम DependsOnTargets उपयोग करना चाहिए। मैंने एमएसबिल्ड स्कोप पर कुछ शोध किया है, आप मेरे ब्लॉग पर अपने परिणाम पा सकते हैं: http://blog.qetza.net/2009/10/23/scope-of-properties-and-item-in-an-msbuild-script/

यह बात परियोजना के लिए वैश्विक दायरा और लक्ष्य के लिए एक स्थानीय दायरा प्रतीत होती है। लक्ष्य दर्ज करते समय, वैश्विक दायरे की प्रतिलिपि बनाई जाती है और लक्ष्य से बाहर निकलने पर, स्थानीय दायरा वापस विलय कर दिया जाता है। तो एक CallTarget संशोधित स्थानीय स्कोप मान नहीं मिलेगा, लेकिन DependsOnTargets दूसरे लक्ष्य में प्रवेश करने से पहले पहले लक्ष्य से बाहर निकल जाएगा।