【问题标题】:Visual Studio does not start build outputVisual Studio 不启动生成输出
【发布时间】:2015-07-02 14:49:11
【问题描述】:

我在一个基于MPF 的自定义项目系统上工作。对于构建,我定义了一个自定义目标文件,该文件定义了所需的最小目标集,例如 Build、Clean 和 Rebuild,以便项目与 Visual Studio IDE 很好地集成;例如,我可以使用 F6 快捷键触发已加载项目的构建,其中快捷键 Ctrl+F5 如果构建成功。但是,不……构建输出信号成功,但 Visual Studio 不尝试启动应用程序?我想知道缺少什么...

我的自定义项目文件没有导入 Microsoft.Common.targets,因为它不是托管语言,并且通用构建目标提供的大多数东西都不适用于我的项目系统(我也希望将 MSBuild 集成保持为尽可能苗条)。

我阅读了以下文档:https://msdn.microsoft.com/en-us/library/vstudio/ms171468(v=vs.110).aspx;在调试部分提到了以下 MSBuild 属性:OutputPath、AssemblyName 和 OutputType;我的自定义 Build 目标设置了所有这些属性,所以我假设 Visual Studio 知道运行我的应用程序所需的一切(当然,即使我的语言服务还不支持调试)。

Build 目标定义如下所示...

<Target Name="Build" 
        DependsOnTargets="PrepareBuildProperties" 
        Returns="$(TargetPath)">
</Target>

我查看了Microsoft.Common.targets 文件,也发现了Run 目标。评论说...

如果是 .EXE,则运行最终的构建输出

它基本上是这样做的(这是原始目标定义的缩短版本)......

<Target Name="Run"
        DependsOnTargets="$(RunDependsOn)">
    <Exec Command="$(TargetPath) $(StartArguments)" 
          WorkingDirectory="$(OutDir)" />
</Target>

如果我从Debug 菜单中选择Start without debugging 命令,或者按Ctrl+F5,Visual Studio 是否应该调用此目标?

【问题讨论】:

    标签: visual-studio msbuild visual-studio-extensions vsx mpf


    【解决方案1】:

    首先声明如下:

    我的自定义项目文件没有导入 Microsoft.Common.targets,因为 这不是托管语言

    没有多大意义,因为任何语言都可以使用 MSBuild .Targets 文件,而不仅仅是托管语言。例如,构建 VC++ 项目在很大程度上依赖于这些文件。现在回到问题上来。

    构建输出信号成功,但 Visual Studio 不会尝试 启动应用程序?我想知道缺少什么

    现代版本的 Visual Studio 与构建项目或运行输出文件无关。 MSBuild 管理整个过程。您必须指定在项目构建后需要执行某些文件的位置。

    您可以使用AfterBuild target 指定构建完成后要执行的任务。此标记位于项目文件的 Project 标记内。您还可以指定条件,以便仅在满足条件时执行任务。

    另一种方法是使用here 中讨论的自定义构建步骤。这种方法更灵活一些。

    还有第三种方式,但可能是最不受欢迎的方式。您可以使用构建后事件。要定义构建后事件,请在 Project 标签下添加:

    <PropertyGroup>
        <PostBuildEvent> task command goes here </PostBuildEvent>
    </PropertyGroup>
    

    问题在于它会出现在项目属性的构建事件选项卡中,因此用户可以看到它并可能更改它。构建后事件旨在供用户而非 IDE 使用。

    你提到的Exec标签代表一个内置任务,指示标签的内容应该被解释为应该执行的命令行。上面讨论的三种技术都是在Exec 任务之上的抽象。此任务在您单击Start without debugging 时运行。

    【讨论】:

    • 首先,感谢您在回答中付出的努力......但实际上并没有真正的帮助。我对理解MSBuild 的工作原理以及如何扩展它没有任何问题。事实上,我的语言服务扩展是一种非托管语言,如 C 或 C++;项目系统当然是基于MSBuild的。我创建了一个自定义目标文件,它使用Exec 调用命令行编译器 - 到目前为止,构建工作正常......
    • @Matze 我已经提到了运行项目输出的三种方法,这正是您所要求的。您是否尝试过其中任何一个但都不起作用?此外,由于您希望使 MSBuild 集成尽可能精简,因此创建自定义目标文件并不能达到此目的。我提到的所有方法都不需要目标文件,它们仅基于减少 MSBuild 集成的项目文件。
    • 所有三种方法都不适用于该特定问题。我有一个单独的目标文件的原因是因为项目文件本身只声明需要构建什么;目标文件改为定义项目的构建方式。所以,我只是分开关注点;就像微软对他们的目标所做的那样。正如我所解释的,我的自定义目标文件定义了 Clean、Build、Rebuild 等目标; Visual Studio 按预期查找并调用它们。我唯一不能工作的是Run 命令;或者至少我不知道 Visual Studio 期望什么目标......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多