首页 文章

Build for .NET 4和.NET 4.5 - 引用的NuGet包怎么样?

提问于
浏览
5

我有一个构建项目的脚本,输出.NET 4.0程序集 .

该项目包括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 回答

  • 1

    刚才有完全相同的要求,没有发现'纯'的NuGet解决方案 . 我怀疑是否存在 . 唯一的选择似乎是维护不同的项目文件(或部分文件) - 对于大量代码库来说绝对不行 .

    我所做的只是在所有项目中只有目标4.5,并且有一个相当简单的msbuild脚本,它创建项目的副本和所有他们的NuGet配置,用于定位其他版本的.Net . 基本上它只是枚举所有.csproj文件,从 net45 - > net40 字符串中查找/替换并以不同的名称保存它们 . 同意包配置/目标/解决方案文件 .

    这几乎是完整的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用于解决方案和packages.Net40.config文件,所有这些都可以构建 . 到现在为止还挺好 .

    虽然小问题: packages.config 在Nuget.exe中被硬编码为一个字符串,因此它不会接受 packages.net40.config 的部分's '算法'来判断传递给 -install 算法的路径是否是实际的包配置,或者包ID . 大声笑 . 我raised a question on this但没有答案 . 无论如何,我不打算让它破坏乐趣,所以我在源代码中进行了单行调整,让它接受任何以 .config 结尾的内容,构建它并立即使用Nuget.exe .

相关问题