这是后台,我们有一个解决方案文件(a.sln),其中包含2个项目(service.csproj& client.csproj)。还有另一个旧的解决方案文件(b.sln),其中包含3个项目(service.csproj,client.csproj& test.csproj)。我们也不使用此解决方案文件和测试项目。
我们使用NANT脚本进行编译。在NANT中,我们使用调用“devenv.com”的<exec> task
来编译解决方案文件。我试图对构建脚本进行一些更改(在构建期间动态生成服务的代理),所以对此我是
试图单独编译service.csproj文件。我更新了NANT脚本,如下所示:
<exec program="${visualstudio.install.dir}\devenv.com" commandline=""${base.dir}\Service.csproj" /rebuild ${config}" failonerror="true" />
但是当执行上面的行时,它会编译(按以下顺序)
一个。 client.csproj 湾service.csproj C。 test.csproj
service.csproj没有对客户端和测试项目的任何项目引用。
我突然发现究竟发生了什么,以及客户/测试项目是如何编译的。
这是我发现的,我们有以下文件夹结构:
MyFolder ->
-> Service
service.csproj
b.sln
-> Client
client.csproj
-> Test
test.csproj
a.sln
由于b.sln已过时且未使用,因此它位于MyFolder中 - &gt;服务文件夹(与service.csproj文件相同的文件夹)。 (开发人员在我的新公司中这么糟糕,他们不删除未使用的文件,只是将其重命名为_old。)
devnenv.com以某种方式从b.sln文件中获取项目文件并进行编译。我删除了b.sln文件,脚本编译service.csproj没有任何问题。但是当service.csproj和b.sln在同一个文件夹中时,visual studio(devenv.com)试图编译所有提到的3个项目该 解决方案文件
任何人都知道发生了什么事?
答案 0 :(得分:1)
这是我从微软那里得到的答案:
直接打开项目文件时,Visual Studio会应用一些启发式方法来尝试查找父解决方案文件。如果Visual Studio在项目的目录或父目录中找到具有匹配项目名称的解决方案文件,则Visual Studio将使用该解决方案。由于devenv / build试图直接从UI重现构建行为,因此仍然应用所有这些启发式方法。由于已失效的b.sln包含service.csproj,它正被启发式选取,在某些情况下可能会导致解决方案中的其他项目也被构建。
您可以通过两种方式解决此问题。要么从项目的文件夹树中删除已解散的解决方案,要么直接执行MSBuild来构建services.csproj。如果您传递。* proj文件,MSBuild不会应用任何解决方案启发式。