我有一个构建项目的脚本,输出.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依赖项为目标框架构建它?
答案 0 :(得分:1)
前一段时间有完全相同的要求,并没有发现'纯'NuGet解决方案。我怀疑是否存在。唯一的选择似乎是维护不同的项目文件(或部分文件) - 对于大量代码库来说绝对不行。
我所做的只是所有项目中的目标4.5,并且有一个相当简单的msbuild脚本,可以创建项目的副本以及用于定位其他版本.Net的所有NuGet配置。基本上它只是枚举所有.csproj文件,从net45
查找/替换 - &gt; 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
。决定传递给-install
算法的路径是实际包配置还是包ID是“算法”的一部分。大声笑。我raised a question on this但没有答案。无论如何,我不打算让这个破坏乐趣,所以我在源代码中进行了单行调整,让它接受任何以.config
结尾的内容,构建它并立即使用Nuget.exe。