以编程方式发布Web应用程序

时间:2011-08-13 23:42:05

标签: visual-studio-2010 vsx envdte

我正在尝试编写一个visual studio扩展,允许我在解决方案中发布多个Web应用程序,类似于在所有项目中使用一键发布功能。

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,但似乎没有任何关于如何使用它的例子。

是否有另一种以编程方式将Web应用程序发布到某个目录的方法,类似于单击发布功能的工作方式?

3 个答案:

答案 0 :(得分:0)

另一种方法是模拟在解决方案资源管理器中单击右键单击“发布”上下文菜单项,如同类似的问题: DTE.ExecuteCommand and wait

请注意,由于这是一个异步命令,您需要构建逻辑以利用发布后事件来迭代您的项目集合(其中一些详细信息显示在其中一个包含的答案中)。

答案 1 :(得分:0)

使用msbuild.exe可执行文件(无论你是如何构建的),将你的sln文件作为项目参数传递,然后定位"发布"目标。

msbuild SlnFolders.sln /t:Publish

您可以在命令行中声明一些属性,也可以使用自己的.targets文件静态声明它们;在.csproj中引用此.targets文件。

<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>

..然后<Target ..> XML可以包含在其中..

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

然后,您可以使用<Exec ..>定义任何其他MSBuild任务,甚至是shell命令。

更多关于MSBuild的信息:https://msdn.microsoft.com/en-us/library/dd393573.aspx

此外,如果您坚持使用C#编写发布逻辑,则可以考虑上述路径并定义自定义 MSBuild任务,即

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

了解here

的方法

答案 2 :(得分:0)

基本上,它归结为以某种方式调用msbuild:

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

我为此编写了一个PowerShell cmdlet,我可以从NuGet包管理器控制台调用它。