.NET Core msbuild ProjectReference

时间:2017-04-10 10:28:39

标签: msbuild .net-core

我有一个解决方案,其中包含一个带有.csproj文件的控制台应用程序,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
</Project>

我还有一个库项目,它使用控制台应用程序生成一堆C#代码,这些代码被编译到库中,库.csproj文件看起来像这样。

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="RunGenerator">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="../generator/generator.csproj">
      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    </ProjectReference>
  </ItemGroup>
  <Target Name="RunGenerator">
    <Exec Command="dotnet run -p &quot;../generator/generator.csproj&quot; input output" /> 
  </Target>
</Project>

这会失败,因为依赖关系分析表明netstandard1.4程序集无法引用netcoreapp1.1程序集。这是正确的,除了我没有引用程序集。

我可以通过构建像这样的生成器项目来解决这个问题:

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="RunGenerator">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  <Target Name="RunGenerator">
    <Exec Command="dotnet build &quot;../generator/generator.csproj&quot;" />
    <Exec Command="dotnet run -p &quot;../generator/generator.csproj&quot; input output" /> 
  </Target>
</Project>

问题在于,当使用包含解决方案文件构建这些项目时,生成器项目不再参与依赖关系分析,并且生成器项目的显式构建有时与解决方案启动的同一项目的另一个构建同时运行构建,这会导致错误,因为文件已被锁定等。

是否可以在不检查目标框架的情况下拥有项目依赖项?

有人可以建议解决方法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

以下是一些MSBuild提示。您可能需要结合其中一些想法。

  1. 您可以使用解决方案文件添加显式项目依赖项。请参阅https://docs.microsoft.com/en-us/visualstudio/ide/how-to-create-and-remove-project-dependencies(此问题最初在此处提出:Visual Studio 2010: How to enforce build order of projects in a solution?)。不幸的是,如果你没有VS,这真的很难。格式是.sln文件有点像噩梦。

  2. 要避免并发构建问题,请使用MSBuild任务而不是Exec任务。请参阅https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task

  3. 
        <Target Name="CompileAnotherProject">
           <MSBuild Projects="../generator/generator.csproj" Targets="Build" />
        </Target>
    
    1. dotnet-run自动调用“dotnet build”。这在并发构建中实际上存在问题。您可以在生成应用程序的generator.csproj中添加一个目标。 “dotnet filepath.dll”运行已编译的应用程序而不构建它。
    2. 
          <Target Name="RunCodeGen" AfterTargets="Build">
               <Exec Command="dotnet $(AssemblyName).dll input output"
                 WorkingDirectory="$(OutDir)" />    
          </Target>