2010-10-13 15 views
5

में देशी सी ++ परियोजनाओं के लिए कस्टम.एफ़टर। माइक्रोसॉफ्ट.कॉमोन। लक्ष्य "मैंने कस्टम.बियर.मिक्रोस.कॉमोन। लक्ष्य" और "कस्टम.एफ़टर.मिक्रॉफ्ट.कॉमोन.targets" के उपयोग के बारे में पढ़ा है। "प्रत्येक प्रोजेक्ट बिल्ड के पहले/बाद में कस्टम लक्ष्य निष्पादित करने के लिए और मैं हमारे टीमसिटी बिल्ड सर्वर पर निर्माण करते समय संस्करण जानकारी बदलने के लिए इस तकनीक का उपयोग करना चाहता हूं।एमएसबिल्ड: VS2010

समस्या यह है कि हालांकि यह सी # परियोजनाओं के लिए काम करता है, यह देशी सी ++ परियोजनाओं के लिए काम नहीं करता है।

माइक्रोसॉफ्ट में कुछ खोदने के बाद। Cpp.targets फ़ाइल मुझे पता चला कि देशी सी ++ परियोजनाओं के लिए यह $ (ForceImportBeforeCppTargets) और $ (ForceImportAfterCppTargets) को सेट करने के माध्यम से लागू किया जा रहा है।

मुझे मूल सी ++ ऐप्स के लिए इस तकनीक के बारे में वेब पर जानकारी का एक टुकड़ा नहीं मिल रहा है, इसलिए मैं पूछ रहा हूं कि मैं सही दिशा में देख रहा हूं या नहीं।

किसी भी मदद की सराहना की जाती है।

+0

आप घटनाक्रम बिल्ड + पूर्व-निर्माण घटना और घटना के बाद बिल्ड सेटिंग्स क्यों उपयोग नहीं कर रहे? –

+0

हम बिल्ड सर्वर से संस्करण जानकारी (और अन्य जानकारी) है प्रयोग नहीं कर रहे पूर्व/पोस्ट घटनाओं का निर्माण क्योंकि वे हमेशा क्रियान्वित कर रहे हैं, हम कुछ है कि केवल तब चलता है जब buildserver पर निर्माण करना चाहते हैं और यह भी मिलता है। इसके अलावा हम एक डेवलपर इन घटना सेटिंग में कुछ डाल करने के लिए भूल जाता है या नहीं, पर निर्भर होना नहीं चाहते हैं, यह स्वत: और 'Custom.Before.Microsoft.Common.targets' प्रदान करता है कि लेकिन मूल कोड के लिए जाहिरा तौर पर नहीं होना चाहिए। – Halt

उत्तर

10

वीसी ++ परियोजनाओं के लिए यह थोड़ा अलग है। आप या तो शुरुआत में या परियोजना के अंत में आयात करने के लिए एक फ़ाइल को परिभाषित करते हैं। इस दृष्टिकोण का उपयोग करने के लिए आपको ForceImportBeforeCppTargets या ForceImportAfterCppTargets गुणों के मानों को परिभाषित करने की आवश्यकता है। उदाहरण के लिए यदि आप प्रोजेक्ट की शुरुआत में फ़ाइल को शामिल करना चाहते हैं तो आप कमांड लाइन पर मान में पास कर सकते हैं। उदाहरण के लिए मैंने अभी एक डमी वीसी ++ परियोजना बनाई जिसे CppTets01 नाम दिया गया है। फिर मैंने नीचे दो नमूना फाइलें बनाईं।

msbuild CppTest01.vcxproj 
    /p:ForceImportBeforeCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\Before.proj"; 
    ForceImportAfterCppTargets="C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\After.proj" 

परिणाम था:

Before.proj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 


    <Target Name="CustomTargetInBefore" AfterTargets="Build"> 
    <Message Text="From CustomTargetInBefore" Importance="high"/> 
    </Target> 

</Project> 

After.proj

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="CustomTargetInAfter" AfterTargets="Build"> 
    <Message Text="From CustomTargetInAfter" Importance="high"/> 
    </Target> 

</Project> 

तो मैं निम्न आदेश निष्पादित C: \ Temp_NET \ throwaway \ CppTest01 \ CppTest01> MSBuild CppTest01.vcxproj/p: ForceImportBeforeCppTargets = "C: \ Temp_NET \ throwaway \ CppTest01 \ सी ppTest01 \ Before.proj"; ForceImportAfterCppTargets = "C: \ Temp_NET \ throwaway \ CppTest01 \ CppTest01 \ After.proj "

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

Build started 10/18/2010 8:32:55 AM. 
Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" on node 1 (default targets). 
InitializeBuildStatus: 
    Creating "Debug\CppTest01.unsuccessfulbuild" because "AlwaysCreate" was specified. 
ClCompile: 
    All outputs are up-to-date. 
    All outputs are up-to-date. 
ManifestResourceCompile: 
    All outputs are up-to-date. 
Link: 
    All outputs are up-to-date. 
Manifest: 
    All outputs are up-to-date. 
FinalizeBuildStatus: 
    Deleting file "Debug\CppTest01.unsuccessfulbuild". 
    Touching "Debug\CppTest01.lastbuildstate". 
CustomTargetInBefore: 
    From CustomTargetInBefore 
CustomTargetInAfter: 
    From CustomTargetInAfter 
Done Building Project "C:\Temp\_NET\ThrowAway\CppTest01\CppTest01\CppTest01.vcxproj" (default targets). 


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

Time Elapsed 00:00:00.21 

आप उत्पादन से देख सकते हैं लक्ष्य सफलतापूर्वक निर्माण प्रक्रिया में इंजेक्ट किया गया था। यदि आप इसे Custom.Before.Microsoft.Common.targets और Custom.Before.Microsoft.Common.targets पर वापस जोड़ना चाहते हैं तो आपको पता होना चाहिए कि वहां उपयोग की जाने वाली तकनीक थोड़ा अलग है। विशेष रूप से यदि आप उन फ़ाइलों को बनाते हैं तो वे स्वचालित रूप से प्रत्येक सी #/वीबी.नेट परियोजना में आयात किए जाते हैं। इस मामले में आपको यह संपत्ति सेट करनी होगी। आप वास्तव में यहाँ दो विकल्प हैं:

  1. आप एक ऐसे वातावरण चर के रूप में इस संपत्ति सेट कर सकते हैं
  2. आप किसी अन्य तकनीक, ImportBefore & ImportAfter जो कुलपति ++

के लिए विशिष्ट है का उपयोग कर सकते # 1 के लिए मुझे थोड़ा सा समझाओ।MSBuild में आप वाक्य रचना $ (PropName) के साथ एक संपत्ति पर पहुंचते तो अगर नाम के साथ एक संपत्ति PropName MSBuild मौजूद नहीं है अगर इस तरह के एक मूल्य मौजूद है को देखने के लिए, अगर यह तो है कि मूल्य दिया जाता है करता है वातावरण चर में दिखेगा । इसलिए यदि आपके पास एक बिल्ड सर्वर है जिसमें आप प्रत्येक वीसी ++ बिल्ड के लिए फ़ाइल शामिल करना चाहते हैं, तो बस उन गुणों को पर्यावरण चर के रूप में बनाएं। अब दूसरी तकनीक के लिए।

आयात से पहले/आयात करें वीसी ++ में एक नई अवधारणा पेश की गई है। Microsoft.Cpp.Win32.targets में आप .targets फ़ाइल के शीर्ष पर घोषणा देख सकते हैं।

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportBefore\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportBefore')" /> 

तो फिर वहाँ नीचे

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportAfter\*.targets" 
Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportAfter')" /> 

ऐसा ही एक आयात घोषणा के रूप में अच्छी तरह से अन्य लक्ष्य प्लेटफार्मों के लिए मौजूद है की दिशा में एक है। विशिष्ट नामों के लिए %ProgramFiles32%\MSBuild\Microsoft.Cpp\v4.0\Platforms\ पर फ़ाइलों को देखें।

इस तकनीक अगर आप चाहते हैं एक फ़ाइल तो बस एक फ़ाइल है कि .targets साथ समाप्त होता है और उचित फ़ोल्डर में जगह बनाने के आयात करने के लिए के साथ

। इसका लाभ यह है कि इसे उस प्लेटफॉर्म के लिए प्रत्येक वीसी ++ बिल्ड में आयात किया जाएगा, और आप कई अलग-अलग फाइलें बना सकते हैं। दोष यह है कि आपको उन्हें उन विशिष्ट फ़ोल्डर्स में रखना होगा। दोनों तकनीकों के बीच यह मुख्य अंतर है। इस पहली तकनीक के साथ आप संपत्ति के माध्यम से फ़ाइल स्थान निर्दिष्ट कर सकते हैं और इसे प्रत्येक बिल्ड के लिए स्वचालित रूप से शामिल नहीं किया गया है, लेकिन दूसरे दृष्टिकोण के लिए यह है कि आप स्थान

+0

इसके बारे में क्षमा करें, मैं गलत जानकारी दे रहा था। मैंने इसे थोड़ा गहरा देखा और इस मुद्दे को सही किया है। मैंने अपने निष्कर्षों को प्रतिबिंबित करने के लिए अपना उत्तर अपडेट कर लिया है। –

+0

धन्यवाद, उत्कृष्ट जवाब है, पुष्टि करने के बाद क्या मुझे लगता है शुरू कर दिया। अब मुझे पता है कि मैं सही रास्ते पर हूं। – Halt

+0

ठीक है, अंदरूनी अपमान के लिए खेद है। –

3

*.props फ़ाइलों में से एक में प्रोजेक्ट सामग्री भी जोड़ सकते हैं निर्देशिका %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\

यह वही प्रभाव डालता है।