Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 从VisualStudio运行自定义msbuild目标_Visual Studio_Msbuild - Fatal编程技术网

Visual studio 从VisualStudio运行自定义msbuild目标

Visual studio 从VisualStudio运行自定义msbuild目标,visual-studio,msbuild,Visual Studio,Msbuild,假设我将自定义目标添加到csproj文件中。有没有办法从VisualStudio运行该目标?我不希望它成为预构建或后构建步骤,我只希望能够从visual studio运行此目标及其依赖项。有一种简单的方法,但使用自定义外部工具并不完全令人满意 假设您的项目文件有以下修改: <Target Name="CalledFromIde"> <Error Text="Called from the IDE!" /> </Target> 运行此命令将生成

假设我将自定义目标添加到csproj文件中。有没有办法从VisualStudio运行该目标?我不希望它成为预构建或后构建步骤,我只希望能够从visual studio运行此目标及其依赖项。

有一种简单的方法,但使用自定义外部工具并不完全令人满意

假设您的项目文件有以下修改:

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