Нашел ответ здесь:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
В Visual Studio 2010 есть отличные новые функции публикации проектов веб-приложений, которые позволяют легко публиковать проект веб-приложения одним нажатием кнопки. За кулисами преобразование Web.config и создание пакета выполняется массивным скриптом MSBuild, который импортируется в файл вашего проекта (находится по адресу: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets). К сожалению, сценарий чрезвычайно сложен, запутан и недокументирован (за исключением некоторых плохо написанных и в основном бесполезных комментариев в файле). Было бы неплохо получить большую блок-схему этого файла и некоторую документацию о том, как подключиться к нему, но, к сожалению, ее не хватает (или, по крайней мере, я не могу ее найти).
К сожалению, это означает, что выполнение публикации через командную строку гораздо более непрозрачно, чем должно быть. Я был удивлен отсутствием документации в этой области, потому что в наши дни многие магазины используют сервер непрерывной интеграции, а некоторые даже выполняют автоматическое развертывание (с чем могут сильно помочь функции публикации VS2010), поэтому я бы подумал, что включение этого ( легко!) было бы основным требованием для этой функции.
В любом случае, после того, как я часами копался в файле Microsoft.Web.Publishing.targets и бился головой о стену проб и ошибок, мне удалось выяснить, как Visual Studio, похоже, выполняет свою магию одним щелчком мыши «Опубликовать в файловой системе» и функции «Сборка пакета развертывания». Я немного расскажу о сценариях MSBuild, поэтому, если вы не знакомы с MSBuild, я предлагаю вам проверить эту страницу MSDN с ускоренным курсом.
Опубликовать в файловой системе
Диалог публикации в файловой системе VS2010 «Публикация в файловой системе» потребовал у меня времени, чтобы разобраться, потому что я ожидал, что будет иметь место какое-то разумное использование MSBuild. Вместо этого VS2010 делает что-то довольно странное: он вызывает MSBuild для выполнения своего рода полуразвертывания, которое подготавливает файлы веб-приложения в папке obj вашего проекта, а затем, похоже, выполняет ручное копирование этих файлов (т. Е. Вне MSBuild) в вашу целевую папку публикации. Это действительно ужасное поведение, потому что MSBuild предназначен для копирования файлов (и других вещей, связанных со сборкой), поэтому было бы разумно, если бы весь процесс был всего лишь одной целью MSBuild, которую вызывала VS2010, а не целью, а затем копией вручную.
Это означает, что сделать это через MSBuild в командной строке не так просто, как вызвать файл проекта с определенной целью и установить некоторые свойства. Вам нужно будет сделать то, что должен был сделать VS2010: самостоятельно создать цель, которая выполняет половину развертывания, а затем копирует результаты в целевую папку. Чтобы отредактировать файл проекта, щелкните правой кнопкой мыши проект в VS2010 и выберите «Выгрузить проект», затем щелкните еще раз правой кнопкой мыши и выберите «Изменить». Прокрутите вниз, пока не найдете элемент Import, который импортирует целевые объекты веб-приложений (Microsoft.WebApplication.targets; сам этот файл импортирует файл Microsoft.Web.Publishing.targets, упомянутый ранее). Под этой строкой мы добавим нашу новую цель под названием PublishToFileSystem:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
Эта цель зависит от цели PipelinePreDeployCopyAllFilesToOneFolder, которую VS2010 вызывает перед копированием вручную. Некоторые поиски в Microsoft.Web.Publishing.targets показывают, что при вызове этой цели файлы проекта помещаются в каталог, указанный свойством _PackageTempDir.
Первая задача, которую мы вызываем в нашей цели, - это задача Error, для которой мы поместили условие, гарантирующее, что задача будет выполняться только в том случае, если свойство PublishDestination не было установлено. Это поймает вас и приведет к ошибке сборки, если вы забыли указать свойство PublishDestination. Затем мы вызываем задачу MakeDir для создания этого каталога PublishDestination, если он еще не существует.
Затем мы определяем элемент под названием PublishFiles, который представляет все файлы, находящиеся в папке _PackageTempDir. Затем вызывается задача копирования, которая копирует все эти файлы в папку назначения публикации. Атрибут DestinationFiles в элементе Copy немного сложен; он выполняет преобразование элементов и преобразует их пути в новые пути, основанные на папке PublishDestination (ознакомьтесь с метаданными хорошо известных элементов, чтобы узнать, что означают эти% () s).
Чтобы вызвать эту цель из командной строки, теперь мы можем просто выполнить эту команду (очевидно, изменив имя файла проекта и свойства в соответствии с вашими требованиями):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
существует для обратной совместимости. VS2010 требует, чтобы этот импорт существовал, даже если он пропущен из-за условия ложности. Если вы посмотрите еще раз, то увидите, что csproj содержит еще один импорт, для$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
которого разрешается файл target для текущей версии Visual Studio.