2017-04-10 1 views
0

은 내가 이런 .csproj 파일로 콘솔 응용 프로그램을 포함하는 솔루션을 라이브러리에 컴파일 된 코드가 있으면 라이브러리 .csproj 파일은 다음과 같습니다..NET 핵심 msbuild를 ProjectReference

<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. 동시 빌드 문제를 피하려면 Exec 태스크 대신 MSBuild 태스크를 사용하십시오. 참조 https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-task


    <Target Name="CompileAnotherProject"> 
     <MSBuild Projects="../generator/generator.csproj" Targets="Build" /> 
    </Target> 
    자동
  1. DOTNET 운영 원용하는 "DOTNET 빌드를". 이것은 동시 빌드에서 실제로 문제가됩니다. 대신 생성 된 후에 앱을 실행하는 generator.csproj에 대상을 추가 할 수 있습니다. "dotnet filepath.dll"은 컴파일하지 않고 컴파일 된 응용 프로그램을 실행합니다.

    <Target Name="RunCodeGen" AfterTargets="Build"> 
     <Exec Command="dotnet $(AssemblyName).dll input output" 
      WorkingDirectory="$(OutDir)" />  
    </Target>