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

3
我正在尝试编写一个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应用程序发布到特定目录的方法?


如果您告诉我们哪一行抛出了异常,可能会有所帮助。 - iandotkelly
你尝试过使用调试器逐步执行吗? - stack72
它不会抛出异常。当我尝试在实验性的Visual Studio中使用扩展时,它只是将错误消息写入输出窗口。我可以成功地逐行执行所有代码,而不会抛出任何类型的异常。 - nivlam
当你逐步执行时,它是否实际发布任何项目? - stack72
不,它没有。实验性的Visual Studio中的输出窗口包含错误消息,没有任何项目被发布。 - nivlam
@nivlam,你最终成功了吗? - Norcino
3个回答

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

点击这里学习。


0

基本上,这归结于以某种方式调用msbuild:

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

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


你能否举个例子,说明如何使用你指定的 cmdlet 在 C# 中以编程方式运行此命令? - Jacob
1
@Jacob 正如我之前提到的,我创建了该 cmdlet 以从 控制台 调用 msbuild。如果您想从 C# 调用 msbuild,可能会像这样:Process.Start("msbuild.exe", "MyProject.csproj /p:PublishProfile=..." - marsze

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接