Відповідь знайшов тут:
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 та натисніть Вивантажити проект, потім ще раз клацніть правою кнопкою миші та натисніть Редагувати. Прокрутіть вниз, поки не знайдете елемент Імпорт, який імпортує цілі веб-додатків (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.
Перше завдання, яке ми викликаємо в нашій цілі, - це завдання Помилка, перед яким ми поставили умову, яка гарантує, що завдання виконується лише в тому випадку, якщо властивість 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
який вирішується до цільового файлу для поточної версії Visual Studio.