Программно опубликовать веб-приложение - PullRequest
2 голосов
/ 14 августа 2011

Я пытаюсь написать расширение Visual Studio, которое позволяет мне публиковать несколько веб-приложений в решении, аналогично использованию функции публикации одним щелчком во всех проектах.

DTE2 service = (DTE2)this.GetService(typeof(DTE));
Projects projects = service.Solution.Projects;
SolutionBuild2 build = (SolutionBuild2)service.Solution.SolutionBuild;

foreach (Project project in projects)
{
   build.PublishProject("Release", project.UniqueName, true);
}

Когда япопробуйте запустить этот код, единственный результат в окне вывода - это:

Error: Object reference not set to an instance of an object.
========== Publish: 0 succeeded, 0 failed, 0 skipped ==========

... что мне мало что говорит.Есть ли способ узнать, что идет не так?

Я также вижу там интерфейс IVsPublishableProjectCfg , но, похоже, нет примеров того, как его использовать.

Есть ли другой способ программной публикации веб-приложений в определенном каталоге, аналогичный тому, как работает функция публикации одним щелчком?

Ответы [ 3 ]

0 голосов
/ 23 апреля 2015

Используйте исполняемый файл msbuild.exe (в любом случае именно так вы строите), передайте файл sln в качестве аргумента проекта и укажите цель «Опубликовать».

msbuild SlnFolders.sln /t:Publish

Вы можете объявить некоторые свойства в командной строке или объявить их статически, используя собственный файл .targets;ссылка на этот файл .targets в вашем .csproj.

<Import Project="MyPublishCustomizations.targets" />

Содержимое файла .targets может выглядеть следующим образом:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Publish">
    </Target>
    <!-- or .. -->
    <Target Name="CustomPublish" BeforeTargets="Publish">
    </Target>
</Project>

.. XML-файл <Target ..> может иметь в нем ..

<PropertyGroup>
    <MyCustomPath>\\our_server\our_share</MyCustomPath>
</PropertyGroup>
<Copy SourceFiles="$(OutDir)\*" DestinationFiles="$(MyCustomPath)" />

Затем вы можете определить любые другие задачи MSBuild, даже команды оболочки, с помощью <Exec ..>.

В более общем плане по MSBuild здесь: https://msdn.microsoft.com/en-us/library/dd393573.aspx

Также, если вы настаиваете на написании логики публикациив C # вы можете рассмотреть описанный выше путь и определить пользовательскую задачу MSBuild , то есть

<ExecuteMyCustomTaskDefinedInCSharp ParameterA="Hello" ParameterB="World" />

Узнайте, как здесь .

0 голосов
/ 13 марта 2017

По сути, все сводится к вызову msbuild следующим образом:

msbuild.exe "MyProject.csproj" /p:PublishProfile="MyPublishProfile.pubxml" /p:DeployOnBuild=true /p:VisualStudioVersion="14.0"

Я написал для этого командлет PowerShell, который можно вызвать из консоли диспетчера пакетов NuGet.

0 голосов
/ 16 сентября 2011

Альтернативный способ сделать это - смоделировать щелчок правой кнопкой мыши на элементе контекстного меню «Опубликовать» в обозревателе решений, как в этом похожем вопросе: DTE.ExecuteCommand и ожидание

Обратите внимание, что, поскольку это асинхронная команда, вам нужно будет встроить логику, чтобы задействовать события после публикации, чтобы выполнить итерацию по вашей коллекции проектов (некоторые подробности об этом показаны в одном из включенных ответов).

...