Cmd satırı ile bir ASP.NET MVC 4 projesini "Yayınlamak" için MSBuild.exe'yi kullanma


82

MSBuild.exeSadece bir MVC 4 projesini alıp belirli bir dizine yayınlayan ona karşı çalıştırmak için bir komut arıyorum .

Örneğin,

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

Bu açıkça yanlış bir sözdizimidir. Sorumu basitleştirmeye çalışıyorum.

Bu soru bir yapı XML'den bahsediyor, ancak bu kadar ayrıntıyla hiçbir şey yapmaya çalışmıyorum.

Ben sadece bir dağıtım yapmaya çalışıyorum.

Bu sorunun daha aşağısında , birisi "MSDeploy" dan bahsediyor. Buna bakabilirim ama tek seçenek bu mu? Sunucuya web dağıtımı yükleme yeteneğim yok. Bu durumda, gerçekten yapmam gereken tek şey "Yayınlamak" ve yayınlanan projenin içeriğini sunucu / dosya sistemindeki belirli bir dizine göndermek.

Kullanabileceğim tek astarı olan var mı?

MSDeploy'u kullanmak zorunda mıyım?

MSDeploy, sunucuya web dağıtımının yüklenmesini gerektirir mi?

Sunucuda web dağıtımı kurmak için bazı bağlantı noktalarının, izinlerin ayarlanması ve bazı IIS eklentilerinin yüklenmesi gerekmez mi?

Basit bir şey yapmayı çok isterim.

Yanıtlar:


152

VS 2012'de ( VS 2010 için Azure SDK'da bulunan yayımlama güncellemelerinin yanı sıra ), web projeleri için komut satırı yayınlamayı basitleştirdik. Bunu Yayın Profilleri kullanarak yaptık.

Bir web projesi için VS'de, yayınlama iletişim kutusunu kullanarak bir yayınlama profili oluşturabilirsiniz. Bu profili oluşturduğunuzda, projenizde Properties \ PublishProfiles altında otomatik olarak saklanır. Oluşturulan profili, aşağıdaki komut satırıyla komut satırından yayınlamak için kullanabilirsiniz.

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

Yayınlama profilini (.pubxml dosyası) başka bir konumda saklamak istiyorsanız, PublishProfile yolunu iletebilirsiniz.

Yayınlama profilleri MSBuild dosyalarıdır. Yayınlama sürecini özelleştirmeniz gerekiyorsa, bunu doğrudan .pubxml dosyası içinde yapabilirsiniz.

Nihai hedefiniz özellikleri komut satırından geçirmekse. Aşağıdakileri tavsiye ederim. VS'de örnek bir yayın profili oluşturun. Komut satırında hangi MSBuild özelliklerini iletmeniz gerektiğini belirlemek için bu yayınlama profilini inceleyin. Bilginize: Tüm yayınlama yöntemi komut satırı yayınlamayı (yani FTP / FPSE) desteklemez.

Bilginize, .sln yerine .csproj / .vbproj oluşturuyorsanız ve VS 2012 kullanıyorsanız, bunu da iletmelisiniz /p:VisualStudioVersion=11.0. Nedeniyle ilgili daha fazla ayrıntı için bkz. Http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .


3
Bence OP, web uygulamasını kendi yerel makinesinde rastgele bir klasöre "dağıtmak" istiyor.
Richard Szalay

3
Öyleyse, bir dağıtım sunucusunda bir kişinin böyle bir komutun çalışması için görsel stüdyo IDE'sini kurması gerekir mi?
Erik5388


10
Bu VS 2013'te çalışıyor mu? Aynı komut satırını çalıştırmak yayınlama oluşturmaz. Hata da yok. Bir yayınlama profilinde basit bir dosya sistemi dağıtımıyla test etme. işler inşa et, ancak yayınlama sonucu yok. Hedef boş.
Rex Whitten

2
Bunu kullandığımda, .pubxml dosyası <LastUsedBuildConfiguration> Release </LastUsedBuildConfiguration> 'a sahip olsa bile Debug yapımı yayınlıyor
reggaeguitar

11

Aşağıdaki gibi görünen bir build.xml dosyası oluşturun

Visual Studio komut istemini başlatın

Msbuild build.xml dosyasını çalıştırın

<?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
Bu cevap bana çok yardımcı oldu, ancak onu geliştirmek için ekleyeceğim bir şey var. Bunu yazıldığı gibi yürütürseniz, robocopy, başarılı bir kopyayı belirtmek için çıkış kodu 1'i döndürür ... msbuild'in yapının başarısız olduğunu düşünmesine neden olur. Bu sorunu çözmek için, robocopy komutundaki / e'den sonra "% errorlevel% leq 1 exit 0 yoksa exit% errorlevel%" ifadesini ekleyin.
Alex

Hem yukarıdaki cevap hem de Alex'in yorumları bana yardımcı oldu. Proje klasörünü temiz tutmak için </Target> öncesine <RemoveDir Dizinleri = "$ (CopyTo)" /> eklerim.
JackArbiter

6

Aşağıdaki komut mükemmel çalışıyor:

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

3
sadece içerik dosyalarını yayınlamak istediğinizde, bu çalışır. Ancak web.config dönüşümleri yürütülmedi
andreas

1
Bu yöntem bir MVC web sitesini yayınlamak için çalışmaz (görünümler kopyalanmaz)
eka808

Web API gibi bir web uygulaması için, bin klasöründe iki kritik dosya üretilmez: App_global.asax.dll ve App_global.asax.compiled. Yukarıda Sayed örneğini kullanmanızı tavsiye ederim.
Fred Peters

1

Söylediğim cevabın varsayılan yapılandırmayı yani Hata Ayıklamayı dağıttığını buldum. Yayımlama Profilinde seçilen yapılandırma MSBuild tarafından yok sayılıyor gibi görünüyor. Buna göre, dağıtım için doğru yapılandırmayı belirtmek için komutu değiştirdim ...

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

config-name = Release veya oluşturduğunuz başka bir yapı yapılandırması


0

Web projeleriyle, yukarıdaki gibi oluşturmanız gerekir, ancak daha sonra da paketlemeniz / kopyalamanız gerekir. "Yayınlamak" yerine bir dosya kopyası kullanıyoruz ...

Ayrıca; web sitesini oluşturmak için DEBUG / RELEASE kullanırız; ancak daha sonra gerçek ortamlar, yani web.config dönüşümlerini işlemek için "QA" veya "PROD".

Bu yüzden ilk olarak RELEASE ile oluşturuyoruz ve ardından aşağıdaki örnekte QA ile paketliyoruz.

  <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>

Yani;

  1. Mülklerinizi ayarlayın
  2. BuildPackage hedefini çağırın
  3. CopyOutput hedefini arayın Ve işte!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.