【问题标题】:Programmatically publish web application以编程方式发布 Web 应用程序
【发布时间】:2011-08-13 23:42:04
【问题描述】:

我正在尝试编写一个 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 应用程序发布到某个目录,类似于一键发布功能的工作原理?

【问题讨论】:

  • 如果你告诉我们哪一行抛出异常可能会有所帮助
  • 您是否尝试过使用调试器单步执行?
  • 它不会抛出异常。当我尝试在实验性 Visual Studio 中使用扩展时,它只是将该错误消息写到输出窗口。我可以成功地遍历所有行,而不会引发任何异常。
  • 当您逐步完成时,它是否真的发布了任何项目?
  • 不,它没有。实验 Visual Studio 中的输出窗口包含错误消息,并且没有发布任何项目。

标签: visual-studio-2010 vsx envdte


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    .. &lt;Target ..&gt; XML 可以包含在其中..

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

    然后您可以定义任何其他 MSBuild 任务,甚至是带有 &lt;Exec ..&gt; 的 shell 命令。

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

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

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

    了解如何here

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 您能否举例说明如何使用您指定的 cmdlet 从 C# 以编程方式运行此命令?
      • @Jacob 正如我所提到的,我创建了用于从 console 调用 msbuild 的 cmdlet。如果您想从 C# 调用 msbuild,它可能类似于 Process.Start("msbuild.exe", "MyProject.csproj /p:PublishProfile=..."
      猜你喜欢
      • 2018-10-30
      • 1970-01-01
      • 2011-07-14
      • 2013-03-19
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多