代码之家  ›  专栏  ›  技术社区  ›  John Källén

如何使msbuild理解.csproj文件取决于另一个.csproj生成的exe的可用性

  •  0
  • John Källén  · 技术社区  · 6 年前

    我有一个大的vstudio解决方案 .csproj 我要移植到新的.net sdk格式的文件。我已经整合了 github 项目与 AppVeyor . 当我研究解决方案时,我的项目是由vstudio构建的; 追随者 使用msbuild生成我的项目。

    解决方案中的所有类库项目文件都已修改,以便指定 <TargetFrameworks>netStandard2.0</TargetFrameworks> . 为了简单起见,让我们用 classlib.csproj .

    该解决方案还包含一些命令行工具,这些工具需要在其他一些项目之前构建,因为后面的项目需要在构建它们自己之前将命令行工具作为预处理器运行。这些命令行项目都指定了 <TargetFrameworks>net472;netcoreapp2.0</TargetFrameworks> . 让我们用 tool.csproj .

    为了正确构建, CSPROJ 需要在之前建造 类库.csproj . 在解决方案中,我使用了 Build dependencies > Project dependencies 命令在vstudio解决方案资源管理器中指明这一点。当我在vstudio内部工作时,这个工作很好。

    但是,当我将更改推到 github , 追随者 开球 msbuild 创建项目的过程。从这个错误中,很明显 小精灵 没有及时建成。似乎 MSBube 不了解 .sln 文件。

    阅读Intertubes上发布的内容(例如 https://devblogs.microsoft.com/visualstudio/incorrect-solution-build-ordering-when-using-msbuild-exe/ ,我试图将以下内容添加到 类库.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 文件以便 小精灵 先建成,希望能在 类库.csproj 开始建造。然而,这是一个种族状况,因为 MSBube 不知道依赖关系。

    那么,我该如何表达 类库.csproj 取决于 CSPROJ 以便 MSBube 明白吗?

    编辑

    结果发现问题是由我为启动工具而编写的目标与msbuild为解决 <Compile> 使用类似于 **\*.cs . 工具生成了文件 之后 全球定位操作。由于全局搜索发生时生成的文件不存在,因此 <编译& GT; 项集合,生成失败。我错误地将错误“foo.cs not found”解释为未能执行该工具,而事实上,这是一个时间问题。

    0 回复  |  直到 6 年前
        1
  •  0
  •   LoLance    6 年前

    要使构建顺序在vs ide之外工作,我们需要使用 add reference 而不是 BuildDependencies=>ProjectDependencies .

    右键单击classlib project并选择add=>reference,在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中,我们还可以禁用并行生成(settings=>build=>msbuild options),以确保在tools.csproj生成结束之前不会生成classlib.csproj。 appveyor中的最终构建顺序将是我们在vs.hope中定义的,希望它能有所帮助。