2011-08-15 13 views
9

मैंने एक कस्टम एमएसबिल्ड कार्य लिखा है जो SubWCRev.exe पर कॉल करता है, जो एक निष्पादन योग्य (आमतौर पर) C:\Program Files\TortoiseSVN\bin में रहता है, चाहे वह 32 या 64 बिट्स हो, क्योंकि TortoiseSVN दोनों संस्करण प्रदान करता है।

समस्या यह है कि विजुअल स्टूडियो 2010 में केवल 32 बिट संस्करण है। तो जब मेरे सहयोगी 64 बिट बॉक्स के साथ मेरे चमकदार नए कार्य का उपयोग करने का प्रयास करते हैं, $(ProgramFiles)C:\Program Files(x86) पर हल हो जाता है और यह कहता है कि SubWCRev.exe नहीं मिल सकता है। क्योंकि उनके पास TortoiseSVN का 64 बिट संस्करण है, जो C:\Program Files में रहता है!

क्या मेरे एमएसबिल्ड स्क्रिप्ट में हार्डकोडिंग C:\Program Files से बेहतर समाधान है, या हर कोई TortoiseSVN के 32 बिट संस्करण का उपयोग कर रहा है? (असल में यह एक सी # प्रोजेक्ट है, मैंने एमएसबिल्ड कोड के साथ थोड़ा सा झुकाया)

उत्तर

14

एक नजर डालें यह इस :

<Project ToolsVersion="4.0" DefaultTargets="PrintValues" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="PrintValues"> 
    <PropertyGroup> 
     <MyProgramFiles>$(ProgramW6432)</MyProgramFiles> 
     <MyProgramFiles Condition="$(MyProgramFiles) == ''">$(ProgramFiles)</MyProgramFiles> 
    </PropertyGroup> 

    <Message Text="MyProgramFiles: $(MyProgramFiles)"/> 
    </Target> 

</Project> 

यह MyProgramFiles 32 और 64 बिट दोनों के लिए "सी: \ प्रोग्राम फ़ाइलें" को हल करने देता है (ProgramW6432 पर्यावरण परिवर्तक विंडोज के गैर-64 बिट संस्करणों पर खाली है)।

+0

तुरंत काम किया! बहुत बहुत धन्यवाद –

1

पथ को हार्डकोड करने की बजाय MSBuildExtensionsPath संपत्ति का उपयोग करें।

प्रति MSDN:

\ Program Files \ या \ Program Files (x86) फ़ोल्डर के अंतर्गत MSBuild सबफ़ोल्डर। यह पथ हमेशा उसी बिथर की प्रोग्राम फ़ाइलों को इंगित करता है, जिस विंडो में आप वर्तमान में चल रहे हैं। उदाहरण के लिए, 64-बिट मशीन पर 32-बिट विंडो के लिए, पथ प्रोग्राम (x86) के लिए पथ है फ़ोल्डर। 64-बिट मशीन पर 64-बिट विंडो के लिए, पथ प्रोग्राम फ़ाइलें फ़ोल्डर है। MSBuildExtensionsPath32 और MSBuildExtensionsPath64 भी देखें।

संपादित करें: 64 बिट SVN फ़ोल्डर में जाने के लिए, का उपयोग करें:

<PropertyGroup> 
    <TortoiseSVNPath>$(MSBuildExtensionsPath64)\..\TortoiseSVN\bin</TortoiseSVNPath> 
</PropertyGroup> 

एक और तरीका है फ़ोल्डरों के होने की जाँच करने के लिए है:

<PropertyGroup> 
    <TortoiseSVNPath Condition="Exists('$(PROGRAMFILES) (x86)')">$(PROGRAMFILES) (x86)\TortoiseSVN\bin</TortoiseSVNPath> 
    <TortoiseSVNPath Condition="$(TortoiseSVNPath) == ''">$(PROGRAMFILES)\TortoiseSVN\bin</TortoiseSVNPath> 
</PropertyGroup> 
+0

क्षमा करें, मैंने अभी कोशिश की है और यह सी: \ प्रोग्राम फ़ाइलें (x86) \ MSBuild को हल किया गया है। मैं सकारात्मक हूं कि यह विंडोज 7 64-बिट बॉक्स है, और विजुअल स्टूडियो एक 32 बिट प्रक्रिया है (बस प्रक्रिया एक्सप्लोरर के साथ जांच की गई है)। –

+0

यह सही व्यवहार है। 32 बिट वीएस के लिए, इसे 'सी: \ प्रोग्राम फ़ाइलें (x86) ...' को हल करना चाहिए। क्या एमएसबिल्ड अंत में आपके लिए एक मुद्दा है? '$ (MSBuildExtensionsPath) \ ..' सही 'प्रोग्राम फ़ाइलें' फ़ोल्डर देगा। – Mrchief

+0

@dario_ramos: उदाहरण के लिए मेरा अद्यतन उत्तर देखें। – Mrchief

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