奇怪的 VS2008 (devenv) Nant 编译问题

Posted

技术标签:

【中文标题】奇怪的 VS2008 (devenv) Nant 编译问题【英文标题】:Weird VS2008 (devenv) Nant compilation issue 【发布时间】:2013-09-12 20:52:02 【问题描述】:

这是背景,我们有一个解决方案文件(a.sln),其中包含 2 个项目(service.csproj 和 client.csproj)。还有另一个旧的解决方案文件 (b.sln),其中包含 3 个项目(service.csproj、client.csproj 和 test.csproj)。我们不使用这个解决方案文件和测试项目。

我们使用 NANT 脚本进行编译。在 NANT 中,我们使用 <exec> task 调用“devenv.com”来编译解决方案文件。我试图对构建脚本进行一些更改(在构建过程中动态生成服务的代理),所以为此我是 试图单独编译 service.csproj 文件。我更新了 NANT 脚本,如下所示:

<exec program="$visualstudio.install.dir\devenv.com" commandline="&quot;$base.dir\Service.csproj&quot; /rebuild $config" failonerror="true" />

但是当上面的行被执行时,它会编译(按以下顺序)

一个。客户端.csproj 湾。服务.csproj C。 test.csproj

service.csproj 没有对客户端和测试项目的任何项目引用。

我想知道到底发生了什么以及客户端/测试项目是如何编译的。

这是我找到的,我们有以下文件夹结构:

MyFolder -> 

    -> Service
        service.csproj
        b.sln
    -> Client
        client.csproj
    -> Test
        test.csproj
    a.sln

由于 b.sln 已过时且未使用,它位于 MyFolder -> Service 文件夹(与 service.csproj 文件相同的文件夹)。 (在我的新公司,开发人员对此非常不满,以至于他们不会删除未使用的文件,而是继续将其重命名为 _old。)

devnenv.com 以某种方式从 b.sln 文件中获取项目文件并编译它们。我删除了 b.sln 文件,脚本编译 service.csproj 没有任何问题。但是当 service.csproj 和 b.sln 在同一个文件夹中时,visual studio (devenv.com) 尝试编译其中提到的所有 3 个项目这 解决方案文件。

有人知道发生了什么吗?

【问题讨论】:

【参考方案1】:

这是我从微软那里得到的答案:

当您直接打开项目文件时,Visual Studio 会应用一些启发式方法来尝试定位父解决方案文件。如果 Visual Studio 在项目目录或父目录中找到具有匹配项目名称的解决方案文件,则 Visual Studio 将使用该解决方案。由于 devenv /build 试图直接从 UI 重现构建行为,所有这些启发式方法仍然适用。由于已失效的 b.sln 包含 service.csproj,它正在被启发式算法拾取,这在某些情况下可能会导致解决方案中的其他项目也被构建。

您可以通过两种方式解决此问题。要么从项目的文件夹树中删除失效的解决方案,要么直接执行 MSBuild 以构建 services.csproj。如果您将 .*proj 文件传递​​给 MSBuild,则它不会应用任何解决方案启发式方法。

【讨论】:

以上是关于奇怪的 VS2008 (devenv) Nant 编译问题的主要内容,如果未能解决你的问题,请参考以下文章

我需要运行 devenv.exe /setup 两次吗? [与 2005 年和 2008 年相比]

尝试在VS2008中右键单击代码会导致锁定

Devenv 命令行切换错误

为啥我的vs2008工具箱中没有控件,显示全部都是灰色的,在设计模式下也没有,而且卸了重装也没有,

vs 2008 快捷操作 及重置

vs 2008 快捷操作 及重置