VS2008

2010-06-20 5 views
11

में वैश्विक रूप से (प्रति उपयोगकर्ता नहीं) "डीबगिंग/कार्यशील निर्देशिका" को बदलना मेरे पास एकाधिक परियोजनाओं के साथ वीएस 2008 में सी ++ समाधान है। इस समाधान में उन फ़ाइलों को शामिल किया गया है जो रनटाइम पर आवश्यक हैं, जो समाधान निर्देशिका के अनुसार समाधान निर्देशिका (उदा। "Testing/data/" + "dataN.bin") के सापेक्ष लोड किए गए हैं।VS2008

आदेश में इस समाधान के लिए काम करने के लिए, मैं इतना है कि यह समाधान निर्देशिका (जैसे Configuration Properties >> Debugging >> Working Directory = $(SolutionDir)) को इंगित करेंगे कार्यशील निर्देशिका परियोजना (ओं) में की स्थापना सेट करना होगा। यह ठीक काम करता है जब मैं अपने पीसी पर डीबगिंग कर रहा हूं। हालांकि, जब कोई अलग उपयोगकर्ता मेरा समाधान लोड करता है, तो उसकी परियोजनाओं में यह संपत्ति ठीक से सेट नहीं होती है।

मैंने इस सेटिंग को प्रोजेक्ट फ़ाइल (PROJECT.vcproj) में संग्रहीत नहीं किया है, लेकिन इसके लिए बनाए गए उपयोगकर्ता-विशिष्ट फ़ाइल में (PROJECT.vcproj.DOMAIN.USER.user)।

मैं इस सेटिंग को मैन्युअल रूप से बार-बार सेट करने के बिना सभी उपयोगकर्ताओं के लिए संग्रहीत करने का एक तरीका चाहूंगा।

मेरे विचार थे:

  • .vcproj फ़ाइल (नहीं उपयोगकर्ता-विशिष्ट एक) या समाधान फ़ाइल में दुकान यह करने के लिए एक रास्ता खोजें।
  • "डिफ़ॉल्ट-उपयोगकर्ता-विशिष्ट फ़ाइल" बनाने के लिए एक तरीका खोजें, जिससे सभी उपयोगकर्ता-विशिष्ट सेटिंग्स प्रारंभ हो जाएंगी (और बाद में बाद में संशोधित हो सकती हैं)।

हालांकि, मुझे इनमें से किसी एक को करने का कोई तरीका नहीं मिला।

कुछ और सूचनाएं/कमी:

  • मैं इन संसाधनों के रूप में कई बड़ी फ़ाइलों के साथ काम करने की जरूरत है, इसलिए मैं अलग निर्देशिका के लिए प्रतियां प्रदर्शन कर से बचने के लिए चाहते हैं।
  • समाधानों को एकाधिक बिल्ड कॉन्फ़िगरेशन (डीबग, रिलीज इत्यादि) का समर्थन करने की आवश्यकता है।
  • चीजों को सरल (कम प्राथमिकता) रखने के लिए, यदि संभव हो तो मैं प्री/पोस्ट बिल्ड स्क्रिप्ट से बचना चाहूंगा।

किसी भी मदद की सराहना की जाएगी ... अग्रिम धन्यवाद।

उत्तर

4

ऐसी कोई संपत्ति मौजूद नहीं है। बड़े मुद्दे हैं, आपके समाधान को तैनात करने के बाद भी इसे काम करने की आवश्यकता है। तब काम करने वाली निर्देशिका एक "समाधान" निर्देशिका नहीं होगी, लक्ष्य मशीन पर कोई नहीं है।

आप इस धारणा से काम करने से बहुत बेहतर हैं कि कार्य निर्देशिका EXE निर्देशिका के समान है। यह डिबगिंग और लक्ष्य मशीन पर डिफ़ॉल्ट दोनों होगा। एक लिंकर सेटिंग के साथ EXE फ़ाइल के स्थान पर आपका पूरा नियंत्रण है। और आप अपने कोड में EXE निर्देशिका प्राप्त करके किसी अन्य कार्यशील निर्देशिका के साथ अपने प्रोग्राम को चलाने वाले शॉर्टकट से स्वयं को सुरक्षित कर सकते हैं ताकि आप एक पूर्ण पथ उत्पन्न कर सकें। GetModuleFileName() का उपयोग करें, EXE फ़ाइल को पथ प्राप्त करने के लिए NULL पास करें।

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

if not exist "$(OutDir)\Testing" md "$(OutDir)\Testing" 
xcopy /d /s "$(SolutionDir)\Testing\*.*" "$(OutDir)\Testing 

नोट कैसे/डी विकल्प है कि नकल सुनिश्चित करता है केवल किया जाता है।

+0

संसाधनों की प्रतिलिपि बनाना: यह चाल करेगा, हालांकि मेरे पास कॉपी करने के लिए बड़ी मात्रा में संसाधन हैं (इस मामले में, बड़े परीक्षण वैक्टर), और यह हर बार कॉपी करने के लिए समय और स्मृति का अपशिष्ट होगा। इसके अतिरिक्त, मेरे पास एकाधिक बिल्ड कॉन्फ़िगरेशन (रिलीज, डीबग, ...) है, जो आगे की नकल का कारण बनेंगे जो मैं टालना चाहता हूं। यह समझ में आता है कि ये वैक्टर मूल "समाधान" निर्देशिका में हैं, क्योंकि इस डेटा का उपयोग कई परियोजनाओं (विभिन्न तरीकों से) द्वारा किया जाता है। इसके अलावा, मैं समाधान की फाइल सूची (निर्देशिका संरचना के संबंध में) में आदेश बनाए रखना चाहता हूं। – scooz

+0

फ्लिप पक्ष पर, रूट समाधान निर्देशिका में निष्पादन योग्य परिणाम की प्रतिलिपि न केवल रूट निर्देशिका पर गड़बड़ी का कारण बनती है, बल्कि यह कई बिल्ड कॉन्फ़िगरेशन का उचित समर्थन नहीं करेगी (उसी नाम की फ़ाइलों को ओवरराइड करना आदि)। ऐसा लगता है कि डीबगिंग उद्देश्यों के लिए, सबसे तार्किक बात करना कामकाजी निर्देशिका बदलना है। आपके द्वारा लाए गए तैनाती के मुद्दों के बारे में (जो मैं सहमत हूं), मैं डीबगिंग के दौरान वहां चीजों को जटिल बना दूंगा (क्योंकि मैं डीबग से कम बार-बार तैनात करता हूं) – scooz

+0

यही कारण है कि मैंने xcopy/d विकल्प के व्यवहार की ओर इशारा किया। आप केवल एक बार प्रतिलिपि के लिए भुगतान कर रहे हैं। –

0

मुझे आश्चर्य है कि क्या यह संभव होगा क्योंकि उपयोगकर्ता के पास पहुंचने और पढ़ने/लिखने के लिए पर्याप्त अधिकार नहीं हो सकते हैं, मुझे लगता है कि वीएस जांच करता है कि यदि उपयोगकर्ता को चुनने पर उपयोगकर्ता की निर्देशिका तक पहुंच होती है तो संभवतः वहां क्यों होता है केवल एक खाता आधारित विकल्प है।

1

आप 'डीबगर/कार्यशील निर्देशिका' सेटिंग के बजाय 'कॉन्फ़िगरेशन गुण/सामान्य/आउटपुट निर्देशिका' या 'कॉन्फ़िगरेशन गुण/लिंकर/आउटपुट फ़ाइल' का उपयोग करने पर विचार कर सकते हैं। ये सेटिंग्स प्रति-प्रोजेक्ट हैं और प्रति उपयोगकर्ता नहीं हैं, और यदि आप कार्यशील निर्देशिका को पर छोड़ देते हैं तो यह ऐप कार्य करने वाली निर्देशिका के लिए डिफ़ॉल्ट मान है।

+0

यदि चीजें मेरे रास्ते पर नहीं जाती हैं, तो मुझे इससे बचने के लिए मेरी इच्छा के बावजूद इस तरह से जाना होगा (हंस पासेंट के उत्तर में मेरी टिप्पणी देखें)। क्या विजुअल स्टूडियो (उदा। 2005) के पिछले संस्करणों में यह व्यवहार अलग नहीं था? – scooz

10
  1. कॉन्फ़िगर हमेशा की तरह अपने डिबगिंग सेटिंग्स, (कार्यशील निर्देशिका, निर्धारित मापदंडों आदि ... सेट), लेकिन चर संबंधित पथ का उपयोग करें। डी: \ MyProject \ libs
  2. अपने समाधान को सहेजें और फिर करीबी विजुअल स्टूडियो जैसे पूर्ण पथ का उपयोग न करें।
  3. अपनी परियोजना निर्देशिका में जाओ और PROJECT.vcproj.COMPUTERNAME.USER.user
  4. का नाम बदलें यह PROJECT.vcproj.user को (इस फ़ाइल में सामान्य डिबगिंग विन्यास हो जाएगा, तो आप इसे प्रतिबद्ध हो सकता है लगता है स्रोत नियंत्रण के लिए)
  5. विजुअल स्टूडियो खोलें, यदि आवश्यक हो तो अपनी डीबगिंग सेटिंग्स में अतिरिक्त जोड़ दें। (अतिरिक्त जानकारी PROJECT.vcproj.COMPUTERNAME.USER.user फ़ाइल जो आप के लिए विशिष्ट है पर संग्रहीत किया जाएगा। ध्यान दें कि PROJECT.vcproj.COMPUTERNAME.USER.user विरासत में मिला विन्यास को पार कर जाएगी)

नमूना परियोजना। vcproj.user फ़ाइल

<?xml version="1.0" encoding="Windows-1252"?> 
<VisualStudioUserFile 
    ProjectType="Visual C++" 
    Version="9,00" 
    ShowAllFiles="false" 
    > 
    <Configurations> 
     <Configuration 
      Name="Release|Win32" 
      > 
      <DebugSettings 
       Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)" 
       WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\" 
       CommandArguments="" 
       Attach="false" 
       DebuggerType="3" 
       Remote="1" 
       RemoteMachine="LOCALHOST" 
       RemoteCommand="" 
       HttpUrl="" 
       PDBPath="" 
       SQLDebugging="" 
       Environment="" 
       EnvironmentMerge="true" 
       DebuggerFlavor="0" 
       MPIRunCommand="" 
       MPIRunArguments="" 
       MPIRunWorkingDirectory="" 
       ApplicationCommand="" 
       ApplicationArguments="" 
       ShimCommand="" 
       MPIAcceptMode="" 
       MPIAcceptFilter="" 
      /> 
     </Configuration> 
     <Configuration 
      Name="Debug|Win32" 
      > 
      <DebugSettings 
       Command="$(ProjectDir)..\Deploy\$(ConfigurationName)\$(TargetFileName)" 
       WorkingDirectory="$(ProjectDir)..\Deploy\$(ConfigurationName)\" 
       CommandArguments="" 
       Attach="false" 
       DebuggerType="3" 
       Remote="1" 
       RemoteMachine="LOCALHOST" 
       RemoteCommand="" 
       HttpUrl="" 
       PDBPath="" 
       SQLDebugging="" 
       Environment="" 
       EnvironmentMerge="true" 
       DebuggerFlavor="0" 
       MPIRunCommand="" 
       MPIRunArguments="" 
       MPIRunWorkingDirectory="" 
       ApplicationCommand="" 
       ApplicationArguments="" 
       ShimCommand="" 
       MPIAcceptMode="" 
       MPIAcceptFilter="" 
      /> 
     </Configuration> 
    </Configurations> 
</VisualStudioUserFile> 
+2

ऐसा प्रतीत होता है कि आप सभी को हटा सकते हैं वर्किंग डायरेक्टरी को छोड़कर गुण अगर वह एकमात्र ऐसा है जिसे आप डिफ़ॉल्ट मान सेट करना चाहते हैं – Joe