奇怪的 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=""$base.dir\Service.csproj" /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 年相比]