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 应用程序发布到某个目录的方法,类似于一键发布功能的工作原理?

4

3 回答 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)" />

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

在此处更普遍地了解 MSBuild:https ://msdn.microsoft.com/en-us/library/dd393573.aspx

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

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

了解如何在这里

于 2015-04-23T17:49:12.127 回答
0

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

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

于 2011-09-16T04:22:56.477 回答
0

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

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

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

于 2017-03-13T11:54:43.093 回答