CmB लाइन के साथ ASP.NET MVC 4 प्रोजेक्ट को "प्रकाशित" करने के लिए MSBuild.exe का उपयोग करना


82

मैं एक कमांड की तलाश कर रहा हूं MSBuild.exeजो केवल एमवीसी 4 प्रोजेक्ट के खिलाफ चलता है और इसे दिए गए डायरेक्टरी में प्रकाशित करता है।

उदाहरण के लिए,

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

यह स्पष्ट रूप से गलत वाक्य रचना है। मैं अपने सवाल को आसान बनाने की कोशिश कर रहा हूं।

यह सवाल बिल्ड एक्सएमएल की बात करता है, लेकिन मैं बहुत विस्तार के साथ कुछ भी करने की कोशिश नहीं कर रहा हूं।

मैं बस एक तैनाती करने की कोशिश कर रहा हूं।

उस सवाल में और नीचे , कोई "MSDeploy" की बात करता है। मैं उस पर गौर कर सकता हूं, लेकिन क्या यह एकमात्र विकल्प है? मेरे पास सर्वर पर वेब परिनियोजित करने की क्षमता नहीं है। जिस स्थिति में, मुझे वास्तव में करने की आवश्यकता है "प्रकाशित करें" और प्रकाशित परियोजना की सामग्री को सर्वर / फाइल-सिस्टम पर दिए गए निर्देशिका में भेजें।

क्या किसी के पास एक लाइनर है जिसका मैं उपयोग कर सकता हूं?

क्या मुझे MSDeploy का उपयोग करना है?

क्या MSDeploy को सर्वर पर स्थापित होने के लिए वेब परिनियोजन की आवश्यकता है?

सर्वर पर वेब परिनियोजन स्थापित करने के लिए कुछ पोर्ट्स, अनुमतियां स्थापित करने और कुछ IIS ऐड-ऑन स्थापित करने की आवश्यकता नहीं है?

मैं बस कुछ सरल निष्पादित करना पसंद करूंगा।

जवाबों:


152

वीएस 2012 में (साथ ही वीएस 2010 के लिए एज़्योर एसडीके में उपलब्ध अपडेट अपडेट ) हमने वेब परियोजनाओं के लिए कमांड लाइन प्रकाशन को सरल बनाया है। हमने प्रकाशित प्रोफाइल का उपयोग करके किया है।

वीएस में एक वेब परियोजना के लिए आप प्रकाशित संवाद का उपयोग करके एक प्रकाशन प्रोफ़ाइल बना सकते हैं। जब आप उस प्रोफ़ाइल को बनाते हैं, तो यह आपकी परियोजना में गुण \ PublishProfiles के अंतर्गत स्वचालित रूप से संग्रहीत हो जाती है। आप कमांड लाइन से निम्नलिखित कमांड लाइन से प्रकाशित करने के लिए बनाई गई प्रोफ़ाइल का उपयोग कर सकते हैं।

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

यदि आप किसी अन्य स्थान पर प्रकाशित प्रोफ़ाइल (.pubxml फ़ाइल) संग्रहीत करना चाहते हैं, तो आप PublishProfile के पथ में पास कर सकते हैं।

प्रकाशित प्रोफाइल MSBuild फाइलें हैं। यदि आपको प्रकाशित प्रक्रिया को अनुकूलित करने की आवश्यकता है तो आप सीधे .pubxml फ़ाइल के अंदर कर सकते हैं।

यदि आपका अंतिम लक्ष्य कमांड लाइन से संपत्तियों में पास करना है। मैं निम्नलिखित की सिफारिश करूंगा। VS में एक नमूना प्रकाशन प्रोफ़ाइल बनाएँ। कमांड लाइन पर पास करने के लिए MSBuild गुणों को निर्धारित करने के लिए प्रोफ़ाइल प्रकाशित करें। FYI सभी विधि समर्थन कमांड लाइन प्रकाशन (यानी FTP / FPSE) प्रकाशित नहीं करते हैं।

FYI करें यदि आप .sln के बजाय .csproj / .vbproj का निर्माण कर रहे हैं और आप VS 2012 का उपयोग कर रहे हैं तो आपको भी पास होना चाहिए /p:VisualStudioVersion=11.0। क्यों देखने के लिए के रूप में अधिक जानकारी के लिए http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx


3
मुझे लगता है कि ओपी केवल वेब ऐप को अपने स्थानीय मशीन पर एक मनमाना फ़ोल्डर में "तैनात" करना चाहता है।
रिचर्ड शेजले

3
इसलिए, परिनियोजन सर्वर पर किसी व्यक्ति को काम करने के लिए उस तरह की कमांड प्राप्त करने के लिए विजुअल स्टूडियो आईडीई स्थापित करने की आवश्यकता होगी?
Erik5388

2
या मैं बस यह कर सकता हूं: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388

10
क्या यह वीएस 2013 में काम करता है? एक ही कमांड लाइन चलाना, कोई प्रकाशित नहीं करता है। कोई त्रुटि भी नहीं। एक प्रकाशन प्रोफ़ाइल में एक साधारण फ़ाइल सिस्टम परिनियोजन के साथ परीक्षण। निर्माण कार्य, jut कोई प्रकाशन परिणाम नहीं। गंतव्य खाली है।
रेक्स Whitten

2
जब मैं इसका उपयोग करता हूं तो यह मेरे डिबग बिल्ड को प्रकाशित करता है भले ही .pubxml फ़ाइल में <LastUsedBuildConfiguration> रिलीज़ </ LastUsedBuildConfiguration>
reggaeguitar

11

एक बिल्ड बनाएँ। xml फ़ाइल नीचे जैसा दिखता है

Visual Studio कमांड प्रॉम्प्ट प्रारंभ करें

Msbuild build.xml चलाएँ

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>

7
यह उत्तर मेरे लिए बहुत उपयोगी था, लेकिन इसमें एक बात है जो मैं इसमें सुधार करूंगा। यदि आप इसे लिखित रूप में निष्पादित करते हैं, तो एक सफल प्रतिलिपि इंगित करने के लिए रोबोकॉपी निकास कोड 1 वापस कर देगा ... जिससे msbuild को लगता है कि निर्माण विफल हो गया है। इसको वर्कअराउंड करने के लिए, रोबोकॉपी कमांड में / e के बाद "% %lelevel% leq 1 से बाहर निकलें 0%% errorlevel%" को सीधे जोड़ दें।
एलेक्स

उपरोक्त उत्तर और एलेक्स की दोनों टिप्पणियाँ मेरे लिए उपयोगी थीं। मैं प्रोजेक्ट फ़ोल्डर को साफ रखने के लिए <RemoveDir निर्देशिकाएँ = "$ (CopyTo)" /> </ लक्ष्य से पहले भी जोड़ूंगा।
जैकएबिटर

6

नीचे दिया गया कार्य सही है:

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"

3
जब आप केवल सामग्री फ़ाइलों को प्रकाशित करना चाहते हैं, तो यह काम करता है। लेकिन web.config परिवर्तनों निष्पादित नहीं कर रहे हैं
एंड्रियास

1
यह विधि MVC वेबसाइट (विचारों की प्रतिलिपि नहीं बनाई गई) को प्रकाशित करने के लिए काम नहीं करती है
eka808

वेब एपीआई जैसे वेब एप्लिकेशन के लिए बिन फ़ोल्डर में दो महत्वपूर्ण फाइलें उत्पन्न नहीं होती हैं: App_global.asax.dll और App_global.asax.compiled। मैं ऊपर सैयद के उदाहरण का उपयोग करने की सलाह देता हूं।
फ्रेड पीटर्स

1

मैंने पाया कि उत्तर डिफॉल्ट कॉन्फ़िगरेशन यानी डिबग को तैनात कर रहा था। प्रकाशन प्रोफ़ाइल में चयनित कॉन्फ़िगरेशन MSBuild द्वारा अनदेखा किया गया प्रतीत होता है। तदनुसार मैंने तैनाती के लिए सही कॉन्फ़िगरेशन निर्दिष्ट करने के लिए कमांड को बदल दिया ...

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

जहाँ config-name = रिलीज़ या आपके द्वारा बनाए गए कुछ अन्य बिल्ड कॉन्फ़िगरेशन


0

वेब परियोजनाओं के साथ आपको ऊपर दिए अनुसार निर्माण करने की आवश्यकता है, लेकिन फिर आपको पैकेज / कॉपी करने की भी आवश्यकता है। हम "प्रकाशित" के बजाय एक फ़ाइल कॉपी का उपयोग करते हैं ...

इसके अलावा, वेबसाइट बनाने के लिए हम DEBUG / RELEASE का उपयोग करते हैं; लेकिन तब वास्तविक वातावरण, अर्थात "QA" या "PROD" वेब को संभालने के लिए ।config रूपांतरित करता है।

तो हम इसे शुरू में RELEASE के साथ बनाते हैं, और फिर QA के साथ पैकेज करते हैं - नीचे दिए गए उदाहरण में।

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

इसलिए;

  1. अपने गुणों को सेट करें
  2. BuildPackage लक्ष्य को कॉल करें
  3. CopyOutput लक्ष्य और वॉइला को बुलाओ!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.