Використання MSBuild.exe для «Опублікування» проекту ASP.NET MVC 4 за допомогою рядка cmd


82

Я шукаю команду для запуску проти, MSBuild.exeяка просто приймає проект MVC 4 і публікує його в заданому каталозі.

Наприклад,

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

Це очевидно неправильний синтаксис. Я намагаюся спростити своє запитання.

Це питання говорить про побудову XML, але я не намагаюся робити що-небудь із такою деталізацією.

Я просто намагаюся зробити розгортання.

Далі в цьому питанні хтось говорить про "MSDeploy". Я можу розглянути це, але чи єдиний варіант? У мене немає можливості встановити веб-розгортання на сервері. У такому випадку все, що мені дійсно потрібно зробити, це "Опублікувати" та надіслати вміст опублікованого проекту до заданого каталогу на сервері / файловій системі.

Хтось має один лайнер, яким я можу скористатися?

Чи потрібно використовувати MSDeploy?

Чи вимагає MSDeploy встановлення веб-розгортання на сервері?

Чи не потрібно для налаштування веб-розгортання на сервері налаштування деяких портів, дозволів та встановлення деяких доповнень IIS?

Я хотів би просто виконати щось просте.

Відповіді:


152

У VS 2012 (а також публікації оновлень, доступних у Azure SDK для VS 2010), ми спростили публікацію в командному рядку для веб-проектів. Ми зробили це за допомогою Publish Profiles.

У VS для веб-проекту ви можете створити профіль публікації за допомогою діалогового вікна публікації. Коли ви створюєте цей профіль, він автоматично зберігається у вашому проекті в меню Properties \ PublishProfiles. Ви можете використовувати створений профіль, щоб опублікувати з командного рядка за допомогою командного рядка наступне.

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

Якщо ви хочете зберегти профіль публікації (файл .pubxml) в іншому місці, ви можете передати шлях до PublishProfile.

Профілі публікації - це файли MSBuild. Якщо вам потрібно налаштувати процес публікації, ви можете зробити це безпосередньо у файлі .pubxml.

Якщо ваша кінцева мета - передати властивості з командного рядка. Я б порекомендував наступне. Створіть зразок публікаційного профілю у VS. Перевірте цей профіль публікації, щоб визначити, які властивості MSBuild вам потрібно ввести в командному рядку. FYI не всі методи публікації підтримують публікацію в командному рядку (тобто FTP / FPSE).

FYI, якщо ви створюєте .csproj / .vbproj замість .sln, і ви використовуєте VS 2012, вам також слід перейти /p:VisualStudioVersion=11.0. Детальніше про те, чому див. Http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .


3
Я думаю, що операційна програма просто хоче "розгорнути" веб-додаток у довільній папці на його локальній машині.
Річард Салай,

3
отже, на сервері розгортання людині потрібно буде встановити IDE візуальних студій, щоб отримати таку команду для роботи?
Erik5388

2
або я міг просто зробити це: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388

10
Чи працює це у VS 2013? Запуск того самого командного рядка не видає публікації. Помилок теж немає. Тестування за допомогою простого розгортання файлової системи у видавничому профілі. будувати твори, жодного результату публікації. Пункт призначення порожній.
Рекс Віттен,

2
Коли я використовую це, він публікує мою збірку налагодження, хоча файл .pubxml має <LastUsedBuildConfiguration> Release </LastUsedBuildConfiguration>
reggaeguitar

11

Створіть файл build.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
Ця відповідь мені дуже допомогла, але я допоміг би її покращити. Якщо ви виконуєте його, як написано, robocopy поверне код виходу 1, щоб вказати успішну копію ... змушуючи msbuild думати, що збірка не вдалася. Щоб вирішити цю проблему, просто додайте "if% errorlevel% leq 1 exit 0 else exit% errorlevel%" після / e у команді robocopy.
Алекс

Як вищевказана відповідь, так і коментарі Алекса були мені корисними. Я також додав би <RemoveDir Directories = "$ (CopyTo)" /> перед </Target>, щоб папка проекту залишалася чистою.
JackArbiter

6

Команда нижче працює ідеально:

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

3
коли ви просто хочете опублікувати файли вмісту, це працює. Але перетворення web.config не виконуються
andreas

1
Цей метод не працює для публікації веб-сайту MVC (подання не копіюються)
eka808,

Для веб-додатків, таких як Web API, у папці bin не створюються два критичні файли: 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" для обробки перетворень web.config.

Отже, ми спочатку будуємо його за допомогою RELEASE, а потім пакуємо за допомогою контролю якості - у прикладі нижче.

  <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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.