当无法找到 sln 文件中定义的外部 EXE 项目时如何抑制 MSBuild 警告

问题描述 投票:0回答:1

我有一个插件 DLL 的 Visual Studio 解决方案文件,当我通过 VS 本地构建时,它工作得很好。它包含一个“项目”,它是对我需要用作 VS 启动项目以调试插件的可执行文件的引用:

Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "Paratext", "%ParatextInstallDir%\Paratext.exe", "{64795DCD-9F35-4E20-9A1F-888A6416329A}"
    ProjectSection(DebuggerProjectSystem) = preProject
        PortSupplier = 00000000-0000-0000-0000-000000000000
        Executable = %ParatextInstallDir%\Paratext.exe
        RemoteMachine = LSDEV-TBOGLE
        StartingDirectory = %ParatextInstallDir%
        Environment = Default
        LaunchingEngine = fb0d4648-f776-4980-95f8-bb7f36ebc1ee
        UseLegacyDebugEngines = No
        LaunchSQLEngine = No
        AttachLaunchAction = No
        IORedirection = Auto
    EndProjectSection
EndProject

但是,当我使用 MSBuild(在本地或在 TeamCity 上)构建解决方案时,它会输出警告:

  EXEC : warning : Project file C:\Projects\Transcelerator\%ParatextInstallDir%\Paratext.exe cannot be found. [C:\Proje

cts\Transcelerator uild\Transcelerator.proj]

在本地,它找不到它,因为它将构建文件夹附加到路径的开头,然后(显然)不扩展

%ParatextInstallDir%
环境变量。在 TeamCity 上,甚至没有定义此环境变量,并且 Paratext.exe 文件根本不存在。没问题,因为对于命令行构建我并不关心该 EXE 的存在。但在完美的世界中,我宁愿根本没有警告。 有没有办法抑制此警告,或者通过某种方式使项目在解决方案中成为条件(如果找不到),或者通过某种命令行开关或配置文件条目来告诉 MSBuild 抑制该警告?

我知道我可以传递项目以在 MSBuild 命令行上单独构建,但这需要在添加(或删除)“正常”项目时保持它们同步。请注意,这不能使用配置来控制;此外部项目已不存在于任何配置中。

msbuild environment-variables solution suppress-warnings
1个回答
0
投票

溶液过滤器

创建排除 Paratext 项目的

解决方案过滤器文件
。在使用 MSBuild 的命令行和使用 MSBuild 的 TeamCity 下,使用 .slnf 文件(而不是 .sln 文件)进行构建。

此方法本质上是创建不包含

Paratext
项目的解决方案的替代视图。您将
Paratext
描述为调试启动 - 所以我假设解决方案中的其他项目没有
ProjectReference
Paratext
,并且当
Paratext
项目不可用时,可以正常构建。

Visual Studio 和 MSBuild

正如您所观察到的,Visual Studio 和 MSBuild 之间解决方案文件的解析是不同的。

在 Microsoft 内部,过去和现在都有不同的团队负责开发工具的不同部分。为了简单起见,解决方案文件的解析器是 Visual Studio 的一部分,但由于某些原因,即使在 Microsoft 内部也没有共享。为了让 MSBuild 在命令行上接受 .sln 文件,MSBuild 团队编写了自己的代码来解析解决方案文件。

© www.soinside.com 2019 - 2024. All rights reserved.