我有一个大型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
文件中的项目依赖项信息。
我阅读了Intertube上发布的内容(例如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为使用类似<Compile>
的模式来解析**\*.cs
项集合而进行的通配操作之间的相互作用引起的。该工具在进行遍历操作后 生成了文件。由于生成文件时发生的生成文件不存在,因此<Compile>
项目集中缺少该文件,并且构建失败。我错误地将错误“ foo.cs找不到”解释为无法执行该工具,实际上,这是一个计时问题。
答案 0 :(得分:0)
要使构建顺序在VS IDE之外运行,我们需要使用
add reference
而不是BuildDependencies=>ProjectDependencies
。
右键单击classlib项目,然后选择add => reference,在Project节点中,选择所需的Tool Project,如下所示:
单击确定以添加它并保存更改。之后,打开classlib.csproj,您可以找到类似以下内容的句子:
<ItemGroup>
<ProjectReference Include="..\xxx\Tools.csproj">
<Project>{6eaa430f-9793-4639-a84b-6ab767d57147}</Project>
<Name>Tools.csproj</Name>
</ProjectReference>
</ItemGroup>
这是msbuild可以理解的。我想这就是您想要的。
之后,您可以使用单个msbuild工具或Appveyor来检查 建立订单。
在Appveyor中,我们还可以禁用paralell构建(设置=> build => msbuild选项),以确保在tools.csproj构建结束之前不会构建classlib.csproj。 Appveyor中的最终构建顺序将是我们在VS中定义的。希望对您有所帮助。