我正在尝试编写一个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应用程序发布到某个目录的方法,类似于单击发布功能的工作方式?
答案 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包管理器控制台调用它。