2013-08-01 7 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は、次のようになります

<packages> 
    <package id="NLog" version="2.0.1.2" targetFramework="net40" /> 
</packages> 

このプロジェクトは、NuGetに公開されようとしている、そして今、私は更新したいですビルドスクリプトは、.NET 4.5アセンブリもビルドするようにします。

今、私は/p:TargetFrameworkVersion="4.5"msbuildに渡して、それを.NET 4.5にすることができますが、まだ.NET 4.0 NLogアセンブリを再構築する予定です。

対象となるフレームワークのNuGet依存関係の正しいバージョンを使用してビルドするにはどうすればよいですか?

答えて

1

これまでとまったく同じ要件があり、「純粋な」NuGet溶液が見つからなかった。そして、私はそこに疑う。唯一のオプションは、さまざまなプロジェクトファイル(またはその一部)を維持するように見えました - 確かに、大規模なコードベースでは何もしません。

代わりに、すべてのプロジェクトで4.5をターゲットにしていました。プロジェクトのコピーを作成するかなり簡単なmsbuildスクリプトと、他のバージョンの.NetをターゲットとするNuGetの設定があります。基本的には、すべての.csprojファイルを列挙し、net45 - >net40文字列から検索/置換し、別の名前で保存します。パッケージのconfig/targets/solutionファイルのidem。ここで

はかなり完全なMSBuildの目標です:

<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のためにあります。 Net40.configファイルはすべて準備ができています。 これまでのところ、とても良いです。

しかし、小さな問題:packages.configは、Nuget.exeの文字列としてハードコードされているので、コマンドラインにpackages.net40.configを受け付けません。 -installアルゴリズムに渡されたパスが実際のパッケージ設定かパッケージIDかどうかを判断する 'アルゴリズム'の一部です。笑。私はraised a question on thisですが、答えはありません。とにかく、これで楽しいことができないようにする予定だったので、ソースで1行調整をして.configで終わるものを受け入れて、そのNuget.exeを使用しました。

関連する問題