【问题标题】:Getting a Target to run BEFORE anything else runs when building from Visual Studio从 Visual Studio 构建时,让目标在其他任何东西运行之前运行
【发布时间】:2009-12-23 18:56:56
【问题描述】:

我试图让一次性成本高昂的目标仅在构建某个顶级项目(具有许多依赖项)时运行。

我从普通的 msbuild / 命令行构建中得到这个工作没有问题。 我通过在项目上设置和 InitialTargets 来做到这一点,或者使用

.

棘手的部分是 Visual Studio。当我从 VS 构建相同的项目时。 VS 在调用我的 .csproj 之前运行依赖项,因此我的目标(这会影响其他项目的构建方式)在它们已经构建之前不会运行。

在调用依赖项之前有没有办法强制 VS 运行目标?

我目前正在解决这个问题,方法是从我最底层的项目(总是构建的项目......)中运行同样昂贵的目标,方法是使用:

条件="$(BuildingInsideVisualStudio)"

关于如何“正确”完成这项工作的任何想法? 同样,我正在寻找一种可以在 VS 中运行的解决方案。

【问题讨论】:

    标签: visual-studio-2008 msbuild dependencies target


    【解决方案1】:

    做到这一点的唯一方法(如果我理解这个问题)是创建一个虚拟项目,你告诉 VS 先构建它,它可以做任何你想做的事情。如果你给它一个 .csproj 扩展名和 Build 目标,VS 几乎可以接受任何 MSBuild 文件。

    【讨论】:

    • 谢谢!好主意,这确实是从 INSIDE VS 以及直接调用 MSBuild 时获得相同行为的最佳方式......
    【解决方案2】:

    Visual Studio 使用 in proc 编译器来帮助构建过程的 UX。因此,VS 和 MSBuild 之间可能存在一些差异。尝试在项目文件中将属性 UseHostCompilerIfAvailable 设置为 false。这将强制 VS 使用 MSBuild 进行构建。缺点是 Visual Studio 内部的性能。

    您将在 .csproj(或 .vbproj)文件中使用以下片段。

    <PropertyGroup>
        <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable>
    </PropertyGroup>
    

    【讨论】:

    • 我试过 UseHostCompilerIfAvailable 来解决同样的问题here,但它没有用。
    【解决方案3】:

    为什么不覆盖&lt;Target Name="BeforeBuild" /&gt; 目标?这将在项目的实际构建之前执行(因为Build 目标取决于BeforeBuild)。 Visual Studio 正在调用 Build 目标(或 Rebuild),因此在 .csproj 中覆盖该目标将导致它首先被调用。

    除非你想在 msbuild 之前做一些事情?

    【讨论】:

    • BeforeBuild 没有帮助。我确实在原始问题中写了这个,但是,StackOverflow 认为这是一个 HTML 标记并将其删除......无论如何,项目的构建目标甚至没有开始运行,所以 BeforeBuild 只会在 VS 决定构建顶部时运行级项目。不幸的是,VS 分析了依赖关系并决定在我想要运行特殊目标的项目之前构建它们。
    • 您是在谈论构建项目还是构建解决方案?因为 Visual Studio 会将整个解决方案传递给 MSBuild,MSBuild 会将所有项目缓存到一个项目文件中,然后按照指定的构建顺序对其进行解析。这可能是首先构建合适的目标的关键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多