Visual studio 从VisualStudio运行自定义msbuild目标
假设我将自定义目标添加到csproj文件中。有没有办法从VisualStudio运行该目标?我不希望它成为预构建或后构建步骤,我只希望能够从visual studio运行此目标及其依赖项。有一种简单的方法,但使用自定义外部工具并不完全令人满意 假设您的项目文件有以下修改:Visual studio 从VisualStudio运行自定义msbuild目标,visual-studio,msbuild,Visual Studio,Msbuild,假设我将自定义目标添加到csproj文件中。有没有办法从VisualStudio运行该目标?我不希望它成为预构建或后构建步骤,我只希望能够从visual studio运行此目标及其依赖项。有一种简单的方法,但使用自定义外部工具并不完全令人满意 假设您的项目文件有以下修改: <Target Name="CalledFromIde"> <Error Text="Called from the IDE!" /> </Target> 运行此命令将生成
<Target Name="CalledFromIde">
<Error Text="Called from the IDE!" />
</Target>
运行此命令将生成以下输出:
Build FAILED.
"F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
(CalledFromIde target) ->
F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!
您要做的是将MSBuild作为外部工具调用,并让它直接运行目标。您必须提供MSBuild的完整路径,因为IDE没有维护其创建的生成环境可用的相同属性
您可以通过在set Tools.ExternalCommand中找出它所在的命令,将其连接到快捷方式
如果您正在寻找一个更复杂的解决方案,它会更复杂一些。以下是VS2010的简而言之:
1创建VS加载项文件|新建|项目|其他项目类型|扩展性| Visual Studio加载项。我不确定是否必须安装VS SDK才能实现这一点,它可以在扩展管理器中获得
在向导中选择以下选项:
-Microsoft Visual Studio 2010
-是,创建“工具”菜单项
-应用程序启动时加载
-我的外接程序永远不会显示模式UI,可以与命令行构建一起使用
2添加对Microsoft.Build和Microsoft.Build.Framework的引用
3在Connect.cs文件中找到Exec的实现
4将其替换为以下代码:
公职人员
字符串commandName,
VSCommandExecutOption执行选项,
参考对象变量,
ref对象变量输出,
参考布尔处理
{
已处理=错误;
如果executeOption!=VSCommandExecuteOption.VSCommandExecuteOptionNodeFault
回来
如果commandName!=BuildAddin.Connect.BuildAddin
回来
var doc=\u applicationObject.ActiveDocument;
var projectItem=doc.projectItem;
var project=projectItem.ContainingProject;
var评估项目=
Microsoft.Build.Evaluation.ProjectCollection
.GlobalProjectCollection.LoadProjectproject.FullName;
var execProject=evalProject.CreateProjectInstance;
bool success=execProject.BuildCalledFromIde,null;
var window=_applicationObject.Windows.itemstants.vsWindowKindOutput;
var output=OutputWindowwindow.Object;
OutputWindowPane=output.OutputWindowPanes.AddBuildAddin;
pane.OutputStringsuccess?生成/t:CalledFromIde:生成失败;
已处理=正确;
回来
}
5由于前一个错误,调试时可以选择更好的自定义目标:
<Target Name="CalledFromIde">
<WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
</Target>
6上面的代码没有检查简洁性的错误,因为它将在IDE中运行,所以您希望更简洁。加载项将在“工具”菜单上放置一个菜单项。如上所述,它只是查找包含当前活动编辑器文档的项目,对于您正在编写的任何内容,都需要一些更好的管道
此技术从IDE中获取构建引擎实例,并让它在项目的单独实例上执行构建。您不必使用Exec编写代码,尽管这是一种方法。更简单的方法是执行以下操作:
"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
</Target>"
将DefaultTargets=Build属性更改为您创建的自定义目标,例如:
然后,在自定义的所有目标中,可以使用DependsOnTargets属性,如下所示:
"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
</Target>"
然后,这将在自定义All目标中生成并输出zip文件 如果您在Visual Studio内部运行构建,则在构建期间将有一个构建变量VisualStudioDir 要仅执行VS生成会话,请执行以下操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>
要仅在VS之外的生成中执行,请执行以下操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>
您需要以两种方式之一包括自定义目标文件
设置环境变量CustomBeforeMocrosoftCommonTargets
通过添加导入,编辑项目文件以包括自定义目标文件
<Imports Project="CustomBuildTasks.Targets"><Imports/>
不久前,我遇到了同样的问题,决定编写VS插件。 试试看:
<Imports Project="CustomBuildTasks.Targets"><Imports/>