Использование 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?

Я бы хотел просто выполнить что-нибудь простое.

Erik5388
источник

Ответы:

152

В VS 2012 (а также в обновлениях публикации, доступных в Azure SDK для VS 2010) мы упростили публикацию из командной строки для веб-проектов. Мы сделали это с помощью профилей публикации.

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

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

Если вы хотите сохранить профиль публикации (файл .pubxml) в другом месте, вы можете передать путь к PublishProfile.

Профили публикации - это файлы MSBuild. Если вам нужно настроить процесс публикации, вы можете сделать это прямо внутри файла .pubxml.

Если ваша конечная цель - передать свойства из командной строки. Я бы рекомендовал следующее. Создайте образец профиля публикации в VS. Проверьте этот профиль публикации, чтобы определить, какие свойства MSBuild необходимо передать в командной строке. К вашему сведению, не все методы публикации поддерживают публикацию из командной строки (например, FTP / FPSE).

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

Сайед Ибрагим Хашими
источник
3
Я думаю, что OP просто хочет «развернуть» веб-приложение в произвольной папке на своем локальном компьютере.
Ричард Салай
3
Итак, на сервере развертывания человеку нужно будет установить IDE визуальных студий, чтобы заставить такую ​​команду работать?
Erik5388
2
или я мог бы просто сделать это: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388
10
Это работает в VS 2013? Запуск той же командной строки не приводит к публикации. Ошибок тоже нет. Тестирование с простым развертыванием файловой системы в профиле публикации. Строительные работы, но результатов публикации нет. Пункт назначения пуст.
Рекс Уиттен
2
Когда я использую это, он публикует мою отладочную сборку, хотя файл .pubxml имеет <LastUsedBuildConfiguration> Release </LastUsedBuildConfiguration>
reggaeguitar 01
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.
Alex
И приведенный выше ответ, и комментарии Алекса были мне полезны. Я бы также добавил <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 02
Для веб-приложения, такого как веб-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 = Release или другая созданная вами конфигурация сборки

Мик
источник
0

С веб-проектами вам необходимо создать, как указано выше, но затем вам также необходимо упаковать / скопировать. Мы используем копию файла, а не "публикацию" ...

Также; мы используем DEBUG / RELEASE для создания веб-сайта; но затем фактические среды, то есть "QA" или "PROD" для обработки преобразований web.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 и вуаля!
Джеймс Джойс
источник