2017-04-10 118 views
0

我有一個包含有.csproj的文件中像這樣的控制檯應用程序的解決方案:.NET核心的MSBuild ProjectReference

<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> 

的問題是,發電機項目中使用的溶液含有文件不再參與在相關性分析時,這些項目的建成並且生成器項目的顯式構建有時可以與解決方案構建啓動的同一項目的另一個構建同時運行,並且這會導致錯誤,因爲文件被鎖定等。

是否可能在不檢查目標的情況下產生項目依賴關係框架?

任何人都可以提出一個解決辦法?

謝謝。

回答

0

這裏有一些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


    <Target Name="CompileAnotherProject"> 
     <MSBuild Projects="../generator/generator.csproj" Targets="Build" /> 
    </Target> 
  • DOTNET運行所調用 「的dotnet構建」 自動。這在併發構建中實際上是有問題的。您可以將目標添加到您的generator.csproj中,該應用程序在構建完成後運行該應用程序。 「dotnet filepath.dll」運行編譯的應用程序而不構建它。
  • 
        <Target Name="RunCodeGen" AfterTargets="Build"> 
         <Exec Command="dotnet $(AssemblyName).dll input output" 
          WorkingDirectory="$(OutDir)" />  
        </Target>