如何使msbuild理解.csproj文件取决于另一个.csproj

时间:2019-03-13 10:59:41

标签: visual-studio msbuild

我有一个大型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找不到”解释为无法执行该工具,实际上,这是一个计时问题。

1 个答案:

答案 0 :(得分:0)

  

要使构建顺序在VS IDE之外运行,我们需要使用add reference   而不是BuildDependencies=>ProjectDependencies

右键单击classlib项目,然后选择add => reference,在Project节点中,选择所需的Tool Project,如下所示:

enter image description here

单击确定以添加它并保存更改。之后,打开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中定义的。希望对您有所帮助。