एक फ़ाइल सिस्टम प्रकाशित प्रोफ़ाइल को निष्पादित करने के लिए msbuild का उपयोग करना


86

मेरे पास ac # .net 4.0 प्रोजेक्ट VS2010 के साथ बनाया गया है और अब इसे VS2012 के साथ एक्सेस किया जा रहा है।

मैं इस वेबसाइट से गंतव्य स्थान तक केवल आवश्यक फाइलों को प्रकाशित करने का प्रयास कर रहा हूं (C: \ buildds \ MyProject [Files])

मेरी फ़ाइल संरचना : /ProjectRoot/MyProject.csproj ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

मैं MSBuild के माध्यम से निम्नलिखित चल रहा हूँ:

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe ./ProjectRoot/MyProject.csproj / p: DeployOnBuild = true /p:PublishProfile .//ProjectRoot/Properties/PublishPystemiles/FileSystemDebug.pubxml

यहाँ FileSystemDebug.pubxml में xml है

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

परिणामी व्यवहार है:

  • एक ज़िप फ़ाइल यहां बनाई गई है:। /ProjectRoot/obj/Debug/Package/MyProjectject.ip
  • <publishUrl>C:\builds\MyProject\</publishUrl>डब्ल्यूटीएफ के लिए कुछ भी तैनात नहीं किया गया है
  • ज़िप फ़ाइल जो बनाई गई है वह एक सूअरों का नाश्ता है और उन फ़ाइलों से भरा है जो आवेदन के लिए आवश्यक नहीं हैं।

जब मैं इस प्रकाशित प्रोफ़ाइल को विज़ुअल स्टूडियो के माध्यम से चलाता हूं, तो एक फ़ोल्डर * C: \ \ पर बनाता है \ MyProject * और सटीक कलाकृतियों को शामिल करता है जो मुझे चाहिए।

मैं यह सरल परिणाम msbuild से कैसे प्राप्त करूं?

जवाबों:


51

FYI करें: विजुअल स्टूडियो 2015 के साथ मेरे पास एक ही मुद्दा था। कई घंटों की कोशिश के बाद, अब मैं कर सकता हूं msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile

मुझे काम करने के लिए अपनी .csproj फ़ाइल को संपादित करना पड़ा। इसमें एक पंक्ति इस प्रकार थी:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

मैंने इस लाइन को इस प्रकार बदला:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />

(मैं 10.0 से 14.0 में बदल गया, यह सुनिश्चित नहीं था कि क्या यह आवश्यक था। लेकिन मुझे निश्चित रूप से शर्त को हटाना होगा।)


1
Condition="false"पीछे की संगतता के लिए सशर्त आयात मौजूद है। VS2010 के लिए आवश्यक है कि यह आयात मौजूद है, भले ही यह झूठी स्थिति के कारण छोड़ दिया गया हो। यदि आप फिर से देखते हैं तो आप देखेंगे कि csproj में एक और आयात है $(VSToolsPath)\WebApplications\Microsoft.WebApplication.targetsजिसके लिए विज़ुअल स्टूडियो के वर्तमान संस्करण के लिए लक्ष्य फ़ाइल में हल होता है।
स्टीवन लेकेन्स 8

3
$(MSBuildToolsVersion)उचित वीएस संस्करण के लिए खाते में मार्ग के रणनीतिक उपयोग पर ध्यान दें <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="false" />:। इसने मेरे लिए VS2015 अपडेट 1 पर काम किया
अल

42

यहाँ उत्तर मिला: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-use-msbuild

विज़ुअल स्टूडियो 2010 में शानदार नए वेब एप्लिकेशन प्रोजेक्ट प्रकाशन सुविधाएँ हैं जो आपको एक बटन के एक क्लिक के साथ अपनी वेब ऐप परियोजना को आसानी से प्रकाशित करने की अनुमति देती हैं। पर्दे के पीछे Web.config परिवर्तन और पैकेज बिल्डिंग एक विशाल MSBuild स्क्रिप्ट द्वारा किया जाता है जो आपकी परियोजना फ़ाइल में आयात की जाती है (पाया: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v \ _ \ _ \ Web \ Microsoft .Web.Publishing.targets)। दुर्भाग्य से, स्क्रिप्ट बेहद जटिल, गन्दा और अनिर्दिष्ट है (अन्य तो कुछ बुरी तरह से वर्तनी और फ़ाइल में ज्यादातर बेकार टिप्पणियां)। उस फ़ाइल का एक बड़ा फ़्लोचार्ट और उस पर हुक करने के तरीके के बारे में कुछ दस्तावेज़ीकरण करना अच्छा होगा, लेकिन लगता है कि इसमें दुख की कमी है (या कम से कम मुझे यह नहीं मिल सकता है)।

दुर्भाग्य से, इसका मतलब यह है कि कमांड लाइन के माध्यम से प्रकाशन करना बहुत अधिक अपारदर्शी है जितना कि इसकी आवश्यकता है। मैं इस क्षेत्र में दस्तावेज़ीकरण की कमी से हैरान था, क्योंकि इन दिनों कई दुकानें एक निरंतर एकीकरण सर्वर का उपयोग करती हैं और कुछ भी स्वचालित तैनाती (जो VS2010 प्रकाशन सुविधाओं के साथ बहुत मदद कर सकते हैं) करते हैं, इसलिए मैंने सोचा होगा कि इसे सक्षम करना ( आसानी से!) सुविधा के लिए एक काफी मुख्य आवश्यकता रही होगी।

वैसे भी, Microsoft.Web.Publishing.targets के माध्यम से घंटों तक खुदाई करने और परीक्षण और त्रुटि दीवार के खिलाफ मेरे सिर को पीटने के बाद, मैंने यह पता लगाने में कामयाबी हासिल की है कि विज़ुअल स्टूडियो अपने जादू को कैसे प्रदर्शित करता है "फाइल सिस्टम को प्रकाशित करें" पर क्लिक करें और "परिनियोजन पैकेज बनाएँ" सुविधाएँ। मैं MSBuild स्क्रिप्टिंग का एक सा हो जाएगा, इसलिए यदि आप MSBuild से परिचित नहीं हैं, तो मेरा सुझाव है कि आप इस क्रैश कोर्स MSDN पृष्ठ को देखें।

फाइल सिस्टम पर प्रकाशित करें

VS2010 पब्लिश टू फाइल सिस्टम डायलॉग पब्लिश टू फाइल सिस्टम ने मुझे थोड़ी देर के लिए निकाल दिया क्योंकि मुझे उम्मीद थी कि MSBuild के कुछ समझदार उपयोग होने वाले हैं। इसके बजाय, VS2010 कुछ अजीब करता है: यह MSBuild को एक तरह की अर्ध-तैनाती करने के लिए कहता है जो आपके प्रोजेक्ट के obj फ़ोल्डर में वेब ऐप की फ़ाइलों को तैयार करता है, फिर यह उन फ़ाइलों की मैन्युअल प्रति (जैसे MSBuild के बाहर) करता है। आपके लक्ष्य में प्रकाशित फ़ोल्डर। यह वास्तव में अजीब व्यवहार है क्योंकि MSBuild को (और अन्य बिल्ड-संबंधित चीजों) के आसपास फ़ाइलों को कॉपी करने के लिए डिज़ाइन किया गया है, इसलिए यह समझ में आता है कि यदि पूरी प्रक्रिया सिर्फ एक MSBuild लक्ष्य थी जिसे VS2010 ने एक लक्ष्य के रूप में कहा, तो एक मैन्युअल प्रतिलिपि नहीं।

इसका मतलब यह है कि कमांड-लाइन पर MSBuild के माध्यम से ऐसा करना उतना आसान नहीं है जितना कि किसी विशेष लक्ष्य के साथ आपकी प्रोजेक्ट फ़ाइल को लागू करना और कुछ गुण सेट करना। आपको ऐसा करने की आवश्यकता होगी कि VS2010 को क्या करना चाहिए: अपने आप को एक लक्ष्य बनाएं जो अर्ध-तैनाती करता है और फिर परिणाम को लक्ष्य फ़ोल्डर में कॉपी करता है। अपनी प्रोजेक्ट फ़ाइल को संपादित करने के लिए, VS2010 में प्रोजेक्ट पर राइट क्लिक करें और अनलोड प्रोजेक्ट पर क्लिक करें, फिर राइट क्लिक करें और फिर एडिट पर क्लिक करें। वेब एप्लिकेशन लक्ष्य (Microsoft.WebApplication.targets) आयात करने वाले आयात तत्व को खोजने तक नीचे स्क्रॉल करें; यह फ़ाइल स्वयं Microsoft.Web.Publishing.targets फ़ाइल आयात करती है जो पहले बताई गई है। इस पंक्ति के नीचे हम अपने नए लक्ष्य को जोड़ेंगे, जिसे PublishToFileSystem कहा जाता है:

<Target Name="PublishToFileSystem"
        DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''"
           Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))"
             Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)"
          DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
          SkipUnchangedFiles="True" />
</Target>

यह लक्ष्य PipelinePreDeployCopyAllFilesToOneFolder लक्ष्य पर निर्भर करता है, जो कि VS2010 अपनी मैन्युअल कॉपी करने से पहले कॉल करता है। Microsoft.Web.Publishing.targets में चारों ओर खुदाई से पता चलता है कि इस लक्ष्य को कॉल करने से प्रोजेक्ट फ़ाइलों को संपत्ति _PackageTempDir द्वारा निर्दिष्ट निर्देशिका में रखा जाता है।

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

इसके बाद हम पब्लिशफिल्स नामक एक आइटम को परिभाषित करते हैं जो _PackageTempDir फ़ोल्डर के तहत मिलने वाली सभी फाइलों का प्रतिनिधित्व करता है। प्रतिलिपि कार्य को तब कहा जाता है जो उन सभी फ़ाइलों को प्रकाशित गंतव्य फ़ोल्डर में कॉपी करता है। गंतव्य तत्व की प्रतिलिपि तत्व पर विशेषता थोड़ा जटिल है; यह आइटमों का एक रूपांतरण करता है और पब्लिशड फोल्डर फ़ोल्डर में रूट किए गए नए रास्तों पर जाने के लिए उनके पथ को परिवर्तित करता है (वेल-ज्ञात आइटम मेटाडेटा देखें) कि वे% (क्या मतलब है) देखें।

कमांड-लाइन से इस लक्ष्य को कॉल करने के लिए हम अब बस इस कमांड को कर सकते हैं (जाहिर है कि प्रोजेक्ट फ़ाइल का नाम और गुण आपके अनुरूप हो):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem

3
मैं नए लक्ष्य के लिए कोड स्निपेट का अर्थ नहीं बता सकता (यह 01 02 03 ... दिखाता है)। क्या आप कृपया संपादित कर सकते हैं?
fan711

2
मैं fan711 से सहमत हूं। हालाँकि, समाधान को लिंक पर छोड़ दिया गया है - फिर इसे कॉपी करने के लिए क्या था?
Антон Курьян

4
@ АнтонКурьян: लिंक कुछ समय बाद मर जाते हैं, इसीलिए stackoverflow.com पर प्रश्न और उत्तर हमेशा बाहरी संसाधनों पर निर्भर न रहते हुए स्व-निहित होने चाहिए।
ओलिवर

परिणाम ऐसे दिखते हैं कि प्रकाशित प्रोफ़ाइल MSBuild द्वारा बिल्कुल भी उपयोग नहीं की जा रही है, और यह बजाय एक पैकेज (शायद एक डिफ़ॉल्ट?) कर रहा है। आपके नीचे दिए गए समाधान से यह पता चलता है कि प्रोफ़ाइल क्या करने के लिए तैयार है, जिसे Microsoft .eb.Publishing.targets हैंडल से सही प्रकार का चयन करके इसे तैनात करता है फ़ोल्डर (फ़ाइल सिस्टम के लिए)। तो लगता है कि आप उस समस्या को हल करने के बजाय, यहां पहिया को फिर से मजबूत कर रहे हैं। लेकिन अपने MSBuild लॉग के बिना यकीन के लिए नहीं कह सकता। मुझे मेरा काम करने के लिए मिला, मेरे उत्तर में विवरण
ग्रेगस

1
ग्रेग्स का समाधान मेरे लिए काम नहीं करता है। ठीक बनाता है, लेकिन कोई फाइलों को प्रकाशित निर्देशिका कॉपी कर रहे हैं
rushinge

19

ऊपर दिए गए सभी उत्तरों की कोशिश करने के बाद भी परेशानी थी (मैं विज़ुअल स्टूडियो 2013 का उपयोग करता हूं)। कुछ भी प्रकाशित फ़ोल्डर में कॉपी नहीं किया गया था।

पकड़ यह थी कि यदि मैं एक समाधान के बजाय एक व्यक्तिगत परियोजना के साथ MSBuild चलाता हूं, तो मुझे एक अतिरिक्त पैरामीटर डालना होगा जो विज़ुअल संस्करण संस्करण को निर्दिष्ट करता है:

/p:VisualStudioVersion=12.0

12.0VS2013 के लिए है, आपके द्वारा उपयोग किए जाने वाले संस्करण के साथ बदलें। एक बार जब मैंने इस पैरामीटर को जोड़ा, तो यह बस काम कर गया।

पूरा कमांड लाइन इस तरह दिखता है:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

मैंने इसे यहाँ पाया है:

http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

वे कहते हैं:

यदि आप समाधान के बजाय एक व्यक्तिगत प्रोजेक्ट निर्दिष्ट करते हैं, तो आपको एक पैरामीटर जोड़ना होगा जो विज़ुअल स्टूडियो संस्करण को निर्दिष्ट करता है।


12

ऐसा लगता है कि आपकी प्रकाशित प्रोफ़ाइल का उपयोग नहीं किया जा रहा है, और कुछ डिफ़ॉल्ट पैकेजिंग कर रहा है। Microsoft वेब प्रकाशित लक्ष्य उन सभी को करता है जो आप ऊपर कर रहे हैं, यह कॉन्फ़िगरेशन के आधार पर सही लक्ष्यों का चयन करता है।

मुझे टीमसिटी MSBuild कदम से कोई समस्या नहीं है, लेकिन मैंने प्रोफ़ाइल के लिए एक स्पष्ट रास्ता निर्दिष्ट किया है, आपको बस इसे .pubxml (जैसे FileSystemDebug) के नाम से पुकारना होगा। यह मानक फ़ोल्डर में तब तक पाया जाएगा, जो आपका है।

उदाहरण:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

ध्यान दें कि यह Microsoft वेब प्रकाशित लक्ष्यों के विज़ुअल स्टूडियो 2012 संस्करणों का उपयोग करके किया गया था, जो आमतौर पर "C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web" पर स्थित होता है। उपयोग किए जाने वाले विशिष्ट परिनियोजन प्रकार लक्ष्य के लिए परिनियोजन फ़ोल्डर देखें


अद्यतन प्रोग्रामिंग के लिए धन्यवाद, कुछ साल पहले पोस्ट किए जाने के बाद से एमएस ने बहुत सुधार किया है?
पी। रो।

3

FYI करें: एक बिल्ड सर्वर पर चलने के साथ एक ही समस्या (एमएसपी 15 के साथ जेनकिंस स्थापित, वीएस 2017 से एक .NET कोर 2.1 मिलियन प्रोजेक्ट पर संचालित)।

मेरे मामले में यह msbuild के साथ "प्रकाशित" लक्ष्य का उपयोग था जिसने प्रोफ़ाइल को नजरअंदाज कर दिया था।

तो मेरा msbuild कमांड के साथ शुरू हुआ:

msbuild /t:restore;build;publish

यह प्रकाशन प्रक्रिया को सही ढंग से ट्रिगर करता है, लेकिन "/ p: PublishProfile = FolderProfile" का कोई संयोजन या भिन्नता कभी भी उस प्रोफ़ाइल को चुनने के लिए काम नहीं करता है जिसे मैं उपयोग करना चाहता था ("FolderProfile")।

जब मैंने प्रकाशित लक्ष्य का उपयोग करना बंद कर दिया:

msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

मैंने (मूर्खतापूर्ण) सोचा कि इससे कोई फ़र्क नहीं पड़ेगा, लेकिन जैसे ही मैंने डिप्लॉयऑनबिल्ड स्विच का इस्तेमाल किया, उसने सही तरीके से प्रोफाइल उठाया।


3

वास्तव में मैंने आपके सभी उत्तरों को अपने स्वयं के समाधान में मिला दिया कि उपरोक्त समस्या को कैसे हल किया जाए:

  1. मैं अपनी आवश्यकताओं के अनुसार pubxml फ़ाइल बनाता हूं
  2. फिर मैं अपने स्वयं के मापदंडों की सूची के लिए pubxml फ़ाइल से सभी मापदंडों को कॉपी करता हूं "/ p: foo = bar" msbuild.exe के लिए
  3. मैं pubxml फ़ाइल को फेंक देता हूं

परिणाम इस प्रकार है:

msbuild /t:restore /t:build /p:WebPublishMethod=FileSystem /p:publishUrl=C:\builds\MyProject\ /p:DeleteExistingFiles=True /p:LastUsedPlatform="Any CPU" /p:Configuration=Release


1

सबसे पहले डेवलपर पीसी के विज़ुअल स्टूडियो संस्करण की जांच करें जो समाधान (प्रोजेक्ट) प्रकाशित कर सकता है। जैसा कि वीएस 2013 के लिए दिखाया गया है

 /p:VisualStudioVersion=12.0

दृश्य स्टूडियो संस्करण किस प्रकार का प्रोजेक्ट बनाना चाहिए, यह निर्दिष्ट करने के लिए उपरोक्त कमांड लाइन जोड़ें। पिछले उत्तर के रूप में, यह तब हो सकता है जब हम केवल एक परियोजना को प्रकाशित करने की कोशिश कर रहे हैं, संपूर्ण समाधान नहीं।

तो पूरा कोड कुछ इस तरह होगा

"C: \ Windows \ Microsoft.NET \ फ्रेमवर्क \ v4.0.30319 \ msbuild.exe" "C: \ Program Files (x86) \ Jenkins \ workspace \ Jenkinssecondsample \ MVCSampleJenkins \ _VCSampleJenkins.csproj" / T: Build / p; : कॉन्फ़िगरेशन = DEBUG / p: OutputPath = "obj \ DEBUG" / p: DeployIisAppPath = "डिफ़ॉल्ट वेब साइट / jenkinsdemoapp" /p:VisualStudioVersion/12.0/


1
क्षमा करें shammakalubo आपने इस प्रश्न का बहुत गलत अर्थ निकाला है।
पी।

1
@shammakalubo उत्तर सही है, लेकिन यह अभी पूरी तरह से नहीं बताया गया है। इस पैरामीटर को ओपी द्वारा उल्लिखित कमांड में जोड़ा जाना चाहिए, जो तब बन जाएगा: MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0यह पैरामीटर वही है जो मुझे याद आ रहा था और मेरे मुद्दे को तय किया था। आपको बस पूरी तरह से उत्तर का उल्लेख करने की आवश्यकता है!
सैयद वकास

@AqasShah धन्यवाद, जैसा कि आपने उल्लेख किया है कि मैंने अपना उत्तर संपादित कर दिया है और पूरा कोड प्रकाशित किया है कि यह कैसा दिखेगा।
शम्मी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.