我有一个插件 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 命令行上单独构建,但这需要在添加(或删除)“正常”项目时保持它们同步。请注意,这不能使用配置来控制;此外部项目已不存在于任何配置中。
创建排除 Paratext
项目的
解决方案过滤器文件。在使用 MSBuild 的命令行和使用 MSBuild 的 TeamCity 下,使用 .slnf 文件(而不是 .sln 文件)进行构建。
此方法本质上是创建不包含
Paratext
项目的解决方案的替代视图。您将 Paratext
描述为调试启动 - 所以我假设解决方案中的其他项目没有 ProjectReference
到 Paratext
,并且当 Paratext
项目不可用时,可以正常构建。
正如您所观察到的,Visual Studio 和 MSBuild 之间解决方案文件的解析是不同的。
在 Microsoft 内部,过去和现在都有不同的团队负责开发工具的不同部分。为了简单起见,解决方案文件的解析器是 Visual Studio 的一部分,但由于某些原因,即使在 Microsoft 内部也没有共享。为了让 MSBuild 在命令行上接受 .sln 文件,MSBuild 团队编写了自己的代码来解析解决方案文件。