【发布时间】:2019-03-13 10:59:40
【问题描述】:
我有一个大型 VStudio 解决方案,我将其 .csproj 文件移植到新的 .NET SDK 格式。我已将github 项目与AppVeyor 集成。当我处理解决方案时,我的项目是由 VStudio 构建的; AppVeyor 使用 msbuild 构建我的项目。
解决方案中的所有类库项目文件都已修改为指定<TargetFrameworks>netStandard2.0</TargetFrameworks>。为简单起见,我们用classlib.csproj表示类库项目文件。
该解决方案还包含一些命令行工具,这些工具需要在其他一些项目之前构建,因为那些后来的项目需要在构建自己之前将命令行工具作为预处理器运行。这些命令行项目都指定<TargetFrameworks>net472;netcoreapp2.0</TargetFrameworks>。让我们用tool.csproj表示工具项目文件。
为了正确构建,tool.csproj 需要在 classlib.csproj 之前构建。在解决方案中,我在 VStudio 解决方案资源管理器中使用了 Build dependencies > Project dependencies 命令来指示这一点。当我在 VStudio 中工作时,这很好用。
但是,当我将更改推送到 github 时,AppVeyor 会启动 msbuild 进程来构建项目。从错误喷出,很明显tool.csproj 没有及时构建。看来msbuild 看不懂.sln 文件中的项目依赖信息。
阅读 intertubes 上发布的内容(例如 https://devblogs.microsoft.com/visualstudio/incorrect-solution-build-ordering-when-using-msbuild-exe/),我尝试将以下内容添加到 classlib.csproj:
<ProjectReference Include="..\tool\tool.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
但是当我这样做时,我得到了错误:
Project '..\tool\tool.csproj' targets 'net472;netcoreapp2.0'. It cannot be referenced by a project that targets '.NETStandard,Version=v2.0'
这显然是有道理的。
我读过的其他一些解决方案建议编辑.sln 文件,以便首先构建tool.csproj,并希望在classlib.csproj 开始构建之前完成构建。然而,这是一个竞争条件,因为msbuild 不知道依赖关系。
那么,我如何表达classlib.csproj 依赖于tool.csproj 以便msbuild 理解它?
编辑
事实证明,该问题是由我为启动工具而编写的目标与 MSBuild 使用类似于 **\*.cs 的模式解析 <Compile> 项目集合所做的通配操作之间的交互引起的。该工具在通配操作之后生成文件。由于在 globbing 发生时生成的文件不存在,因此 <Compile> 项目集合中缺少它,并且构建失败。我错误地将错误“foo.cs not found”解释为未能执行该工具,而事实上,这是一个时间问题。
【问题讨论】:
-
确保您的 .sln 文件包含类似 :
Project("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") = "classlib", "..\classlib.csproj", "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" ProjectSection(ProjectDependencies) = postProject {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} = {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} EndProjectSection EndProject的项目依赖项,并且您的 .sln 用于使用 msbuild 构建 -
约翰,有什么更新吗?我已经检查过它是否适用于具有多个 .net 框架项目的解决方案。如果它不适用于 .net fx 和 .net 标准的情况,请告诉我。我会用你的更多信息对其进行测试。
-
@LanceLi-MSFT 我还在为此苦苦挣扎。如果您有空闲时间,请查看github.com/uxmal/reko 的
netStandard分支并尝试使用MsBuild 构建它。 -
好的。我会在星期一试试。
-
@JohnKällén 我尝试根据您提供的 github 链接进行构建。但是在我下载它之后,里面的文件夹太多了,我不知道要测试哪种解决方案。因为其中一些看起来像 C++,而其中一些只有 .csproj 而没有 .sln。您能否告诉哪个文件夹可以代表您的情况,或者您可以通过一个驱动器共享一个简单的示例解决方案,我将在 msbuild 和 appveyor 中进行测试。
标签: visual-studio msbuild