Visual Studio 2010 имеет команду «Опубликовать», которая позволяет опубликовать проект веб-приложения в расположении файловой системы. Я хотел бы сделать это на моем сервере сборки TeamCity, поэтому мне нужно сделать это с помощью решения Runner или msbuild. Я попытался использовать цель публикации, но я думаю, что это может быть для ClickOnce:
msbuild Project.csproj /t:Publish /p:Configuration=Deploy
Я в основном хочу сделать именно то, что делает проект веб-развертывания, но без надстройки. Мне нужно, чтобы он скомпилировал WAP, удалил все файлы, ненужные для выполнения, выполнил любые преобразования web.config и скопировал вывод в указанное место.
Мое решение , основанное на ответе Джеффа Сивера
<Target Name="Deploy">
<MSBuild Projects="$(SolutionFile)"
Properties="Configuration=$(Configuration);DeployOnBuild=true;DeployTarget=Package"
ContinueOnError="false" />
<Exec Command=""$(ProjectPath)\obj\$(Configuration)\Package\$(ProjectName).deploy.cmd" /y /m:$(DeployServer) -enableRule:DoNotDeleteRule"
ContinueOnError="false" />
</Target>
Ответы:
Я получил это в основном работает без специального сценария msbuild. Вот соответствующие параметры конфигурации сборки TeamCity:
Это скомпилирует, упакует (с преобразованием web.config) и сохранит вывод как артефакты. Единственное, чего не хватает, это скопировать вывод в указанное место, но это можно сделать либо в другой конфигурации сборки TeamCity с зависимостью артефакта, либо с помощью сценария msbuild.
Обновить
Вот скрипт msbuild, который скомпилирует, упакует (с преобразованием web.config) и скопирует вывод на мой промежуточный сервер
Вы также можете удалить свойства SolutionName и ProjectName из тега PropertyGroup и передать их в msbuild.
Обновление 2
Поскольку этот вопрос все еще получает много трафика, я подумал, что стоит обновить мой ответ с помощью моего текущего сценария, который использует Web Deploy (также известный как MSDeploy).
В TeamCity у меня есть параметры
env.Configuration
,env.ProjectName
иenv.DeployServiceUrl
. У бегуна MSBuild есть путь к файлу сборки, и параметры передаются автоматически (их не нужно указывать в параметрах командной строки).Вы также можете запустить его из командной строки:
источник
Package
цель также зависит от WebDeploy:error : Package/Publish task Microsoft.Web.Publishing.Tasks.IsCleanMSDeployPackageNeeded failed to load Web Deploy assemblies. Microsoft Web Deploy is not correctly installed on this machine.
(Упомяну его, поскольку вы пишете, что ваше второе обновление использует WebDeploy, что может означать, что первое еще не будет использовать WebDeploy.)Используя профили развертывания, представленные в VS 2012, вы можете опубликовать их с помощью следующей командной строки:
Для получения дополнительной информации о параметрах см. Это .
Значения
/p:VisualStudioVersion
параметра зависят от вашей версии Visual Studio. В Википедии есть таблица выпусков Visual Studio и их версий .источник
/p:VisualStudioVersion=?
VS VS?msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Но все равно получаю только DLL, а не все файлы, как в папке publish: (`/p:VisualStudioVersion=15
. Я не уверен, связано ли это с вашей проблемой копирования файлов.Я придумал такое решение, прекрасно работает для меня:
Секретный соус - цель _WPPCopyWebApplication.
источник
error MSB4057: The target "_WPPCopyWebApplication" does not exist in the project
. Изъятие этой части привело к развертыванию без развертывания каких-либо представленийMSBuild.exe C:\BuildAgent\work\4c7b8ac8bc7d723e\WebService.sln /p:Configuration=Release /p:OutputPath=bin /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=https://204.158.674.5/msdeploy.axd /p:username=Admin /p:password=Password#321 /p:AllowUntrustedCertificate=True /p:DeployIisAppPath=Default WebSite/New /p:MSDeployPublishMethod=WMSVC
. Это дает мне ошибкуMSBUILD : error MSB1008: Only one project can be specified. Switch: WebSite/New
. Есть ли решение для этого?Я не знаю TeamCity, поэтому надеюсь, что это сработает для вас.
Лучший способ сделать это - MSDeploy.exe. Это часть проекта WebDeploy, выполняемого Microsoft. Вы можете скачать биты здесь .
С WebDeploy вы запускаете командную строку
Это делает то же самое, что и команда VS Publish, копируя только необходимые биты в папку развертывания.
источник
В VisualStudio 2012 есть способ обработки subj без публикации профилей. Вы можете передать выходную папку, используя параметры. Работает как с абсолютным, так и с относительным путем в параметре publishUrl. Вы можете использовать VS100COMNTOOLS, однако вам нужно переопределить VisualStudioVersion, чтобы использовать целевой «WebPublish» из
%ProgramFiles%\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets
. С VisualStudioVersion 10.0 этот сценарий будет успешным без выходных данных :)Обновление: мне удалось использовать этот метод на сервере сборки, на котором установлена только Windows SDK 7.1 (без Visual Studio 2010 и 2012 на компьютере). Но я должен был выполнить следующие шаги, чтобы заставить это работать:
Автор сценария:
источник
нашел два разных решения, которые работали немного по-другому:
1. Это решение основано на ответе alexanderb [ссылка] . К сожалению, у нас это не сработало - некоторые DLL не были скопированы в OutDir. Мы обнаружили, что замена
Недостатком этого решения был тот факт, что OutDir содержал не только файлы для публикации.ResolveReferences
наBuild
target решает проблему - теперь все необходимые файлы копируются в папку OutDir.2. Первое решение работает хорошо, но не так, как мы ожидали. Мы хотели, чтобы функциональность публикации была такой же, как в Visual Studio IDE - то есть только файлы, которые должны быть опубликованы, будут скопированы в выходной каталог. Как уже упоминалось, первое решение копирует гораздо больше файлов в OutDir - веб-сайт для публикации затем сохраняется в
_PublishedWebsites/{ProjectName}
подпапке. Следующая команда решает эту проблему - только файлы для публикации будут скопированы в нужную папку. Теперь у вас есть каталог, который можно публиковать напрямую - по сравнению с первым решением вы сэкономите место на жестком диске.AutoParameterizationWebConfigConnectionStrings=false
Параметр гарантирует, что строки подключения не будут обрабатываться как специальные артефакты и будут генерироваться правильно - для получения дополнительной информации см. ссылку .источник
Вы должны установить свою среду
и ссылаться на мой блог. (извините, пост был корейский)
http://blog.naver.com/PostSearchList.nhn?SearchText=webdeploy&blogId=xyz37&x=25&y=7
источник
Это мой командный файл
источник
это моя рабочая партия
публиковать-мой-website.bat
Обратите внимание, что я установил Visual Studio на сервере для возможности запуска,
MsBuild.exe
потому чтоMsBuild.exe
папки в .Net Framework не работают.источник
msbuild test.sln /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=.\build_output1\pub /p:PublishProfile=FolderProfile /p:VisualStudioVersion=11.0 /p:outdir=.\build_output1
...... Но все равно получаю только DLL, а не структуру файлов, которую я хочу. Что с этим не так? :(Вы можете опубликовать решение с желаемым путем с помощью кода ниже. Здесь PublishInDFolder - это имя, путь к которому нам нужно опубликовать (нам нужно создать его на рисунке ниже)
Вы можете создать файл публикации, как это
Добавьте ниже 2 строки кода в пакетный файл (.bat)
источник
Для генерации выходных данных публикации предоставьте еще один параметр. msbuild example.sln / p: publishprofile = имя профиля / p: deployonbuild = true / p: конфигурация = отладка / или любая
источник