visual studio - समाधान में परियोजना निर्भरताओं का उपयोग करते समय एमएसबिल्ड संदर्भों(डीएलएल फाइलों) की प्रतिलिपि नहीं करता है




visual-studio msbuild (12)

मेरे विजुअल स्टूडियो सोल्यूशन में सभी परियोजनाएं हैं (हर कोई .NET 3.5 को लक्षित करता है) - मेरी समस्या के लिए केवल ये दोनों महत्वपूर्ण हैं:

  1. MyBaseProject <- यह कक्षा लाइब्रेरी एक तृतीय-पक्ष DLL फ़ाइल (elmah.dll) का संदर्भ देती है
  2. MyWebProject1 <- इस वेब एप्लिकेशन प्रोजेक्ट में MyBaseProject का संदर्भ है

मैंने " स्टॉर्म जोड़ें ..." → "ब्राउज़ करें" टैब पर क्लिक करके विजुअल स्टूडियो 2008 में MyBaseProject के लिए elmah.dll संदर्भ जोड़ा है "elmah.dll" का चयन करना।

एल्मा संदर्भ की गुण निम्नानुसार हैं:

  • उपनाम - वैश्विक
  • स्थानीय कॉपी करें - सच
  • संस्कृति -
  • विवरण - ASP.NET के लिए लॉगिंग मॉड्यूल और हैंडलर (ELMAH) त्रुटि
  • फाइल प्रकार - असेंबली
  • पथ - डी: \ webs \ otherfolder \ _myPath \ __ उपकरण \ elmah \ Elmah.dll
  • हल - सही
  • रनटाइम संस्करण - v2.0.50727
  • निर्दिष्ट संस्करण - झूठी
  • मजबूत नाम - झूठा
  • संस्करण - 1.0.11211.0

MyWebProject1 में मैंने प्रोजेक्ट माईबेस प्रोजेक्ट का संदर्भ जोड़ा: "संदर्भ जोड़ें ..." → "प्रोजेक्ट्स" टैब → "MyBaseProject" का चयन करना। निम्नलिखित संदर्भों को छोड़कर इस संदर्भ की गुण समान हैं:

  • विवरण -
  • पथ - डी: \ webs \ CMS \ MyBaseProject \ bin \ Debug \ MyBaseProject.dll
  • संस्करण - 1.0.0.0

यदि मैं विजुअल स्टूडियो में बिल्ड चलाता हूं तो elmah.dll फ़ाइल को MyBaseProject.dll के साथ मेरी MyWebProject1 की बिन निर्देशिका में कॉपी किया गया है!

हालांकि अगर मैं समाधान के लिए एमएसबिल्ड को साफ और चलाता हूं (डी: \ webs \ CMS> सी: \ विन्डोज़ \ माइक्रोसॉफ्ट.नेट \ फ्रेमवर्क \ v3.5 \ MSBuild.exe / t: ReBuild / p: कॉन्फ़िगरेशन = डीबग MyProject.sln ) elmah.dll MyWebProject1 की बिन निर्देशिका में अनुपलब्ध है - हालांकि बिल्ड में स्वयं को कोई चेतावनी या त्रुटियां नहीं हैं!

मैंने पहले ही यह सुनिश्चित कर लिया है कि MyBaseProject के .csproj में "सत्य" मान के साथ निजी तत्व शामिल है (जो विजुअल स्टूडियो में " प्रतिलिपि स्थानीय " के लिए उपनाम होना चाहिए):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(निजी टैग डिफ़ॉल्ट रूप से .csproj के xml में प्रकट नहीं हुआ था, हालांकि विजुअल स्टूडियो ने "स्थानीय प्रतिलिपि" सत्य कहा था। मैंने "स्थानीय प्रतिलिपि" को गलत - सहेजे गए - और फिर इसे फिर से सत्य पर सेट किया - सहेजें!)

एमएसबिल्ड के साथ क्या गलत है? मैं (elmah.dll) संदर्भ को MyWebProject1 के बिन में कैसे कॉपी करूं?

मैं प्रत्येक प्रोजेक्ट के पोस्टबिल्ड कमांड में पोस्टबिल्ड कॉपी एक्शन नहीं जोड़ना चाहता हूं! (कल्पना कीजिए कि मेरी कई परियोजनाएं MyBaseProject पर निर्भर होंगी!)


आज मेरे पास एक समान समस्या थी, और यह निश्चित रूप से आपके प्रश्न का उत्तर नहीं है। लेकिन मैं सभी को सूचित करना चाहता हूं, और संभवतः अंतर्दृष्टि की चमक प्रदान करता हूं।

मेरे पास एएसपी.नेट एप्लीकेशन है। निर्माण प्रक्रिया को साफ करने और फिर निर्माण करने के लिए सेट है।

मेरे पास दो Jenkins CI स्क्रिप्ट हैं। उत्पादन के लिए एक और स्टेजिंग के लिए एक। मैंने अपने आवेदन को स्टेजिंग पर तैनात किया और सब ठीक काम किया। उत्पादन में तैनात और एक डीएलएल फ़ाइल गायब था जिसे संदर्भित किया गया था। यह डीएलएल फ़ाइल सिर्फ परियोजना की जड़ में थी। किसी भी NuGet भंडार में नहीं। डीएलएल do not copy करने के do not copy सेट किया गया था।

सीआई स्क्रिप्ट और आवेदन दो तैनाती के बीच समान था। स्टेजिंग वातावरण में स्वच्छ और तैनाती के बाद भी डीएलएल फ़ाइल को एएसपी.NET एप्लिकेशन ( bin/ ) के तैनाती स्थान में बदल दिया गया था। यह उत्पादन पर्यावरण के लिए मामला नहीं था।

यह एक परीक्षण शाखा में निकला है, मैंने इस डीएलएल फ़ाइल को bin निर्देशिका में कॉपी करने के लिए बिल्ड प्रक्रिया में एक कदम जोड़ा था। अब वह हिस्सा जो पता लगाने में थोड़ा समय लगा। सीआई प्रक्रिया खुद को साफ नहीं कर रही थी। डीएलएल को कामकाजी निर्देशिका में छोड़ दिया गया था और एएसपी.NET .zip फ़ाइल के साथ गलती से पैक किया जा रहा था। उत्पादन शाखा में कभी भी डीएलएल फ़ाइल की प्रतिलिपि नहीं थी और कभी गलती से इसे तैनात नहीं किया गया था।

TLDR; जांचें और सुनिश्चित करें कि आप जानते हैं कि आपका बिल्ड सर्वर क्या कर रहा है।


इसके लिए आपके प्रोजेक्ट में .targets फ़ाइल जोड़ने और इसे प्रोजेक्ट के अनुभाग में शामिल करने की आवश्यकता है।

प्रक्रिया के लिए यहां मेरा जवाब देखें।


घातक योजना का उपयोग करना,

वाई => एक्स => ए => बी ,

मेरी समस्या तब थी जब मैंने वाई बनाया, एक्स से असेंबली (ए और बी, उनमें से सभी 15) वाई के बिन फ़ोल्डर में दिखाई नहीं दे रहे थे।

मैंने वाई से संदर्भ एक्स को हटाकर, सहेजने, निर्माण करने, फिर एक्स संदर्भ (एक प्रोजेक्ट संदर्भ) दोबारा जोड़ने, और सहेजने, निर्माण करने और ए और बी को वाई के बिन फ़ोल्डर में दिखाना शुरू कर दिया।


जिस मुद्दे का सामना करना पड़ रहा था, मेरे पास एक परियोजना है जो लाइब्रेरी प्रोजेक्ट पर निर्भर है। निर्माण के लिए मैं इन चरणों का पालन कर रहा था:

msbuild.exe myproject.vbproj /T:Rebuild
msbuild.exe myproject.vbproj /T:Package

बेशक इसका मतलब था कि मैं बिन में अपनी लाइब्रेरी की डीएलएल फाइलों को याद कर रहा था और सबसे महत्वपूर्ण पैकेज पैकेज ज़िप फ़ाइल में था। मैंने पाया कि यह पूरी तरह से काम करता है:

msbuild.exe myproject.vbproj /T:Rebuild;Package

मुझे नहीं पता कि यह काम क्यों है या यह पहली जगह क्यों नहीं था। लेकिन उम्मीद है कि मदद करता है।


निर्माण के दौरान उपयोग नहीं किए जाने वाले असेंबली का संदर्भ सही अभ्यास नहीं है। आपको अपनी बिल्ड फाइल को बढ़ाना चाहिए ताकि यह अतिरिक्त फाइलों की प्रतिलिपि बना सके। या तो पोस्ट बिल्ड इवेंट का उपयोग करके या संपत्ति समूह को अपडेट करके।

कुछ उदाहरण अन्य पोस्ट में पाए जा सकते हैं


पर एक नज़र डालें:

यह एमएसबिल्ड मंच धागा मैंने शुरू किया

आपको वहां मेरा अस्थायी समाधान / कामकाज मिलेगा!

(MyBaseProject को कुछ कोड की आवश्यकता है जो elmah.dll से कुछ वर्गों (जो भी) को संदर्भित कर रहे हैं elmah.dll को MyWebProject1 के बिन में कॉपी किया जा रहा है!)


मुझे बस एक ही समस्या थी और यह इस तथ्य के कारण हुआ कि उसी समाधान में 2 परियोजनाएं तृतीय पक्ष पुस्तकालय के एक अलग संस्करण का संदर्भ दे रही थीं।

एक बार जब मैंने सभी संदर्भों को सही किया, तो सबकुछ पूरी तरह से काम करता था।


मुझे भी यही समस्या थी।

जांचें कि क्या आपकी परियोजना का ढांचा संस्करण डीएल के ढांचे संस्करण के समान है जो आपने संदर्भ में रखा है।

मेरे मामले में, मेरे क्लाइंट को "फ्रेमवर्क 4 क्लाइंट" का उपयोग करके संकलित किया गया था और डीएलएल "फ्रेमवर्क 4" में था।


मैं बस इस तरह से सौदा करता हूँ। अपने संदर्भ के गुणों पर जाएं और ऐसा करें:

Set "Copy local = false"
Save
Set "Copy local = true"
Save

और बस।

विजुअल स्टूडियो 2010 प्रारंभ में नहीं रखा गया है: संदर्भ टैग में <private>True</private> और "स्थानीय प्रतिलिपि" सेटिंग को गलत बनाने के कारण यह टैग बनाने के कारण है। इसके बाद यह इसे तदनुसार सही और गलत पर सेट करेगा।


मैं बस एक बहुत ही समान मुद्दे में भाग गया। विजुअल स्टूडियो 2010 का उपयोग करते समय संकलन करते समय, डीएलएल फ़ाइल को bin फ़ोल्डर में शामिल किया गया था। लेकिन MSBuild का उपयोग करते समय संकलित करते समय तृतीय-पक्ष DLL फ़ाइल शामिल नहीं थी।

अधिक निराश। जिस तरह से मैंने इसे हल किया था, वह मेरे वेब प्रोजेक्ट में पैकेज के NuGet संदर्भ को शामिल करना था, भले ही मैं इसे सीधे उपयोग नहीं कर रहा हूं।


वेबसाइट प्रोजेक्ट में आपके प्रोजेक्ट्रेरेंस से सभी संदर्भित डीएलएल फाइलों को शामिल करना हमेशा एक अच्छा विचार नहीं है, खासकर जब आप निर्भरता इंजेक्शन का उपयोग कर रहे हैं: आपका वेब प्रोजेक्ट सिर्फ इंटरफ़ेस डीएलएल फ़ाइल / प्रोजेक्ट में संदर्भ जोड़ना चाहता है, न कि कोई ठोस कार्यान्वयन डीएलएल फ़ाइल।

क्योंकि यदि आप डीएलएल फ़ाइल / प्रोजेक्ट को कार्यान्वित करने के लिए सीधे एक संदर्भ जोड़ते हैं, तो आप अपने डेवलपर को इंटरफ़ेस के बजाय कार्यान्वयन डीएलएल फ़ाइल / प्रोजेक्ट के ठोस वर्गों पर "नया" कॉल करने से नहीं रोक सकते हैं। कार्यान्वयन का उपयोग करने के लिए आपने अपनी वेबसाइट में "हार्डकोड" भी कहा है।


.NET Framework 4 क्लाइंट प्रोफाइल से .NET Framework 4 में लक्ष्य ढांचे को बदलने से मेरे लिए यह समस्या ठीक हो गई।

तो अपने उदाहरण में: MyWebProject1 पर .NET Framework 4 पर लक्ष्य ढांचे को सेट करें





project