假设我将自定义目标添加到csproj文件。有没有办法从Visual Studio中运行该目标?我不想让它成为预构建或构建后步骤,我只是希望能够从visual studio运行此目标(及其依赖项)。从VisualStudio运行自定义msbuild目标
回答
使用自定义的外部工具有一个简单的方法(尽管不是所有满意的)。
假设你的项目文件的以下修改:
<Target Name="CalledFromIde">
<Error Text="Called from the IDE!" />
</Target>
转到工具|外部工具,并添加一个这样的:
Title: Called from IDE
Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
Arguments: $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
Initial directory: $(ProjectDir)
Use Output window: checked
运行此产生输出为:
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不会保留与其创建的构建环境相同的属性。
您可以通过计算出它在Tools.ExternalCommand#集合中的哪个命令#来将它连接到快捷方式。
如果您正在寻找一个更复杂的解决方案,它会涉及更多一点。这里简单地说(VS2010):
1)创建一个VS Addin(File | New | Project | Other Project Types | Extensibility | Visual Studio Add-in)。我不确定您是否必须安装VS SDK才能获得该版本,它可以在扩展管理器中找到。
在向导中选择下列选项: - 微软的Visual Studio 2010 - 是的,创建“工具”菜单项 - 加载应用程序启动时 - 我的外接绝不会容忍模式UI,和可以与命令行构建一起使用。
2)添加引用Microsoft.Build和Microsoft.Build.Framework
3)查找Exec的在Connect.cs实现文件
4)替换为以下代码:
public void Exec(
string commandName,
vsCommandExecOption executeOption,
ref object varIn,
ref object varOut,
ref bool handled)
{
handled = false;
if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
return;
if (commandName != "BuildAddin.Connect.BuildAddin")
return;
var doc = _applicationObject.ActiveDocument;
var projectItem = doc.ProjectItem;
var project = projectItem.ContainingProject;
var evalProject =
Microsoft.Build.Evaluation.ProjectCollection
.GlobalProjectCollection.LoadProject(project.FullName);
var execProject = evalProject.CreateProjectInstance();
bool success = execProject.Build("CalledFromIde", null);
var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
var output = (OutputWindow)window.Object;
OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");
handled = true;
return;
}
5)在调试好自定义的目标,因为以前的一个错误:
<Target Name="CalledFromIde">
<WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
</Target>
6)为简洁起见,上面的代码没有错误检查,因为它将在IDE中运行,所以您希望更清洁。插件会在你的工具菜单上放置一个菜单项。如上所述,它只是寻找包含当前活动编辑器文档的项目,无论你做什么,都需要更好的管道。
该技巧从IDE中获取构建引擎实例,并使其在单独的项目实例上执行构建。
你不必用Exec编写代码,尽管这是一种方法。更简单的方法是做到以下几点:
更改DefaultTargets="Build"
属性自定义目标创建,说"All"
像这样:
DefaultTargets="All"
然后在您的自定义的“所有”目标,您可以使用DependsOnTargets属性,如下所示:
"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
</Target>"
然后,这将建立和出把zip文件在您的自定义"All"
目标。
如果您在Visual Studio中运行构建,则在构建期间将会有VisualStudioDir的构建变量。
仅执行是VS建立会话做到这一点:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>
要只在VS之外构建执行此操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>
您将需要包括您的自定义目标文件以两种方式之一。
- 设置环境变量CustomBeforeMicrosoftCommonTargets
编辑你的项目文件中加入进口
<Imports Project="CustomBuildTasks.Targets"><Imports/>
- 1. VisualStudio-自定义平台
- 2. 构建失败后运行MSBuild目标
- 3. AfterBuildCompiler(msbuild)目标定义在哪里?
- 4. MSBuild从自定义任务参数
- 5. 从msbuild调用VS自定义工具
- 6. MSBuild:在指定解决方案时构建自定义项目目标
- 7. 如何使用MSBuild从后期构建事件运行目标
- 8. 仅在编译时运行自定义目标
- 9. 如何在Intellij IDEA中运行自定义Maven目标?
- 10. 运行不带pom.xml的自定义Maven目标
- 11. 为MSBuild自定义Windows CMD
- 12. msbuild自定义任务
- 13. MSBuild - 目标从属进口
- 14. 从Eclipse运行自定义部署者
- 15. 自定义条目标题
- 16. Msbuild将项目引用解析为自定义项目类型
- 17. MSBuild AfterPublish目标
- 18. 运行自定义环境
- 19. WiX自定义操作 - 在目标目录中运行应用程序
- 20. 从自定义目录
- 21. MSBuild,自定义任务运行自定义工具来生成linq到sql模型的类?
- 22. 自定义游标行为
- 23. 运行MSBuild,尊重卸载的项目
- 24. MSBUILD针对匹配项目运行NCover
- 25. 在MSBuild的解决方案级别运行一次目标运行一次
- 26. VS2010的MSBuild目标只能运行在重建
- 27. 如何创建仅在必要时运行的MSBuild目标
- 28. 解决方案构建后运行MsBuild任务(目标?)?
- 29. 跳过MSBuild目标
- 30. 目标与MSBuild的