मैंने इसे सरल तरीके से "हल किया" (चारों ओर काम बनाया)।
पोस्ट बिल्ड में
dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"
pub
वह फ़ोल्डर है जहाँ आप चाहते हैं कि आपका प्रकाशित सामान मंचन के लिए जाए
नोट:dotnet.exe
आप किस संस्करण का उपयोग करते हैं, इसके आधार पर कमांड --no-build
उपलब्ध नहीं हो सकता है।
उदाहरण के लिए, v2.0.3 में उपलब्ध नहीं; और v2.1.402 में उपलब्ध है। मुझे पता है कि VS2017 अपडेट 4 में v2.0.3 था। और अपडेट 8 में 2.1.x है
अपडेट करें:
ऊपर दिया गया सेटअप मूल डीबग वातावरण में काम करेगा, लेकिन इसे सर्वर / उत्पादन वातावरण में बनाने के लिए अधिक आवश्यकता होगी। इस विशेष उदाहरण में जिसे मुझे हल करना था, हम निर्माण करते हैं Release|x64
और Release|x86
अलग से। इसलिए मैंने दोनों का हिसाब किया। लेकिन पोस्ट बिल्ड dotnet publish
कमांड का समर्थन करने के लिए , मैंने पहली बार RuntimeIdentifier
प्रोजेक्ट फाइल में जोड़ा ।
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<OutputPath>..\..\lib\</OutputPath>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
मुझे इसकी आवश्यकता क्यों थी और आप इसके बिना क्यों दूर हो सकते हैं? मुझे इसकी आवश्यकता थी क्योंकि मेरा बिल्ड प्रोग्राम MSB3270 की चेतावनी को बाधित करने के लिए सेट है , और यदि यह दिखाई देता है तो बिल्ड को विफल करें। यह चेतावनी कहती है, "हे, तुम्हारी निर्भरता की कुछ फाइलें गलत प्रारूप की हैं"। लेकिन क्या आपको इस अभ्यास का लक्ष्य याद है? हमें पैकेज निर्भरता DLL खींचने की आवश्यकता है। और कई मामलों में यह कोई फर्क नहीं पड़ता अगर यह चेतावनी है क्योंकि निम्नलिखित पोस्ट बिल्ड का ध्यान नहीं है। फिर से, यह मेरा निर्माण कार्यक्रम है जो परवाह करता है। इसलिए, मैंने केवल RuntimeIdentifier
2 कॉन्फ़िगरेशन जोड़े जिन्हें मैं उत्पादन के दौरान उपयोग करता हूं।
पूरी पोस्ट का निर्माण
if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y
if $(ConfigurationName) == Release (
dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)
xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R
स्पष्टीकरण: डॉटनैट प्रकाशित की तलाश में है obj\Debug
या obj\Release
। हमारे पास बिल्ड के दौरान यह नहीं है क्योंकि बिल्ड बनाता है obj\x64\Release
या obj\x86\Release
। लाइन 1 और 2 इस समस्या को कम करते हैं। पंक्ति 3 में मैं dotnet.exe
विशिष्ट कॉन्फ़िगरेशन और लक्ष्य रनटाइम का उपयोग करना बताता हूं । अन्यथा, जब यह डिबग मोड होता है, तो मैं रनटाइम सामान और चेतावनी के बारे में परवाह नहीं करता हूं। और अंतिम पंक्ति में मैं बस अपने dll ले और फिर उत्पादन फ़ोल्डर में प्रतिलिपि बनाएँ। काम हो गया।
dotnet publish
हैक क्यों होगा ? अपनी csproj फ़ाइल में कमांड को पोस्ट बिल्ड स्क्रिप्ट के रूप में शामिल करें।