2013-08-01 1 views
5

.NET 4.0 어셈블리를 출력하는 프로젝트를 빌드하는 스크립트가 있습니다..NET 4 및 .NET 4.5 용 빌드 - 참조 된 NuGet 패키지는 무엇입니까?

프로젝트에는 NuGet의 NLog가 포함되어 있습니다.

<Reference Include="NLog"> 
    <HintPath>..\packages\NLog.2.0.1.2\lib\NLog\net40\NLog.dll</HintPath> 
</Reference> 

그리고 내 packages.config은 다음과 같습니다 : 그래서 프로젝트 파일의 기준은 다음과 같다

이 프로젝트는 NuGet에 게시 할 것입니다, 지금은 업데이트 할

<packages> 
    <package id="NLog" version="2.0.1.2" targetFramework="net40" /> 
</packages> 
빌드 스크립트는 .NET 4.5 어셈블리도 빌드합니다.

이제는 /p:TargetFrameworkVersion="4.5"msbuild에 전달하고 대상을 .NET 4.5로 설정할 수 있습니다.하지만 .NET 4.0 NLog 어셈블리를 다시 빌드 할 예정입니다.

대상이되는 프레임 워크에 대해 올바른 버전의 NuGet 종속성을 사용하여 어떻게 빌드 할 수 있습니까?

답변

1

이전에 정확히 동일한 요구 사항이 있었고 '순수한'NuGet 솔루션을 찾을 수 없었습니다. 그리고 거기에 의심의 여지가 있습니다. 유일한 옵션은 다른 프로젝트 파일 (또는 그 일부)을 유지하는 것 같았습니다 - 대대적 인 코드 기반은 절대 필요하지 않았습니다.

대신 모든 프로젝트에서 4.5를 대상으로했으며, 다른 버전의 .Net을 대상으로하는 NuGet 구성 및 프로젝트의 복사본을 만드는 다소 간단한 msbuild 스크립트가 있습니다. 기본적으로 모든 .csproj 파일을 열거하고 net45 ->net40 문자열을 찾아서 바꾸고 다른 이름으로 저장합니다. 패키지 config/targets/solution 파일에 대한 idem.

<Target Name="MakeNet40Projects"> 
    <ItemGroup> 
    <SourceProjs Include="$(MyProjectDir)*\*\*.csproj" Exclude="$(MyProjectDir)\*\*\*.Net40.csproj"/> 
     ... 
    <SourceConfigs Include="$(MyProjectDir)*\*\packages.config"/> 
     ... 
    <DestProjs Include="%(SourceProjs.RootDir)%(SourceProjs.Directory)%(SourceProjs.FileName).Net40.csproj"/> 
    <DestConfigs Include="%(SourceConfigs.RootDir)%(SourceConfigs.Directory)%(SourceConfigs.FileName).Net40.config"/> 
    </ItemGroup> 
    <PropertyGroup> 
    <OldPackages>packages.config</OldPackages> 
    <NewPackages>packages.Net40.config</NewPackages> 
    <OldTargets>NuGet.targets</OldTargets> 
    <NewTargets>NuGet.Net40.targets</NewTargets> 
    <OldProj>\.csproj</OldProj> 
    <NewProj>.Net40.csproj</NewProj> 
    </PropertyGroup> 

    <Copy SourceFiles="@(SourceProjs)" DestinationFiles="@(DestProjs)"/> 
    <FileUpdate Files="@(DestProjs)" Regex="[Nn][Ee][Tt]45" ReplacementText="net40" Encoding="utf-8"/> 
    <FileUpdate Files="@(DestProjs)" Regex="$(OldPackages)" ReplacementText="$(NewPackages)" Encoding="utf-8"/> 
    <FileUpdate Files="@(DestProjs)" Regex="$(OldTargets)" ReplacementText="$(NewTargets)" Encoding="utf-8"/> 
    <FileUpdate Files="@(DestProjs)" Regex="$(OldProj)" ReplacementText="$(NewProj)" Encoding="utf-8"/> 

    <Copy SourceFiles="@(SourceConfigs)" DestinationFiles="@(DestConfigs)"/> 
    <FileUpdate Files="@(DestConfigs)" Regex="[Nn][Ee][Tt]45" ReplacementText="net40" Encoding="utf-8"/> 

    <Copy SourceFiles="$(MsBuildThisFileDirectory)\.nuget\$(OldTargets)" DestinationFiles="$(MsBuildThisFileDirectory)\.nuget\$(NewTargets)"/> 
    <FileUpdate Files="$(MsBuildThisFileDirectory)\.nuget\$(NewTargets)" Regex="$(OldPackages)" ReplacementText="$(NewPackages)" Encoding="utf-8"/> 

    <Copy SourceFiles="$(MsBuildThisFileDirectory)\my.sln" DestinationFiles="$(MsBuildThisFileDirectory)\my.Net40.sln"/> 
    <FileUpdate Files="$(MsBuildThisFileDirectory)\my.Net40.sln" Regex="$(OldProj)" ReplacementText="$(NewProj)" Encoding="utf-8"/> 
    <FileUpdate Files="$(MsBuildThisFileDirectory)\my.Net40.sln" Regex="NuGet\.targets" ReplacementText="$(NewTargets)" Encoding="utf-8"/> 
</Target> 

이를 실행 한 후 솔루션 및 패키지 각 프로젝트에 대한 .Net40.csproj하는 .Net40.sln하는 Nuget.Net40.targets을있다 :

여기에 거의 완전한 MSBuild를 대상입니다. Net40.config 파일은 모두 준비가되었습니다. 지금까지 그렇게 좋았습니다.

작은 문제 : packages.config은 Nuget.exe에서 문자열로 하드 코드되어 있으므로 명령 줄에 packages.net40.config을 수락하지 않습니다. -install 알고리즘에 전달 된 경로가 실제 패키지 구성인지 또는 패키지 ID인지를 결정하는 '알고리즘'의 일부입니다. Lol. I raised a question on this하지만 답이 없습니다. 어쨌든 나는 이것이 재미를 망칠 수 있도록 할 계획이 아니 었습니다. 소스에서 한 줄 조정을하여 .config으로 끝나는 것을 받아들이고 그것을 빌드 한 다음 Nuget.exe를 지금 사용하십시오.