我已经阅读了一些帖子(参见下面的参考资料),还没有找到特定于我的技术堆栈的最佳实践指南.
目标:创建一个NuGet包,其目标是使用MSBuild和NuGet通过TeamCity从单个.csproj文件构建的多个.NET框架.
约束:
我有两种方法:
创建单个构建配置.它将包含三个构建步骤:编译.NET 3.5,编译.NET 4.0,使用NuGet打包.每个构建步骤都取决于最后一个成功.我用这种方法看到的唯一真正的问题(希望有一个我不知道的解决方案)是每个构建步骤都需要自己的一组构建参数(例如,system.TargetFrameworkVersion和system.OutputPath)来指定DLL的唯一位置(例如,bin\release\v3.5和bin\release\v4.0),以便NuGet包步骤能够根据.nuspec文件中的Files部分执行其操作.
创建多个构建配置.每个构建步骤的一个构建配置.使用这种方法,很容易解决TargetFrameworkVersion和OutputPath构建参数问题,但我现在必须创建快照依赖项并在构建中共享程序集版本号.它也会占用构建配置插槽,这对我们来说是好的(但不是最佳的),因为我们拥有Enterprise许可证.
选项#1似乎是显而易见的选择.选项#2感觉很脏.
所以我的两个问题是:
参考文献:
msbuild teamcity .net-framework-version multitargeting nuget
我正在尝试构建一个多目标.NET 4.5.1和.NET Standard 1.3的类库.根据文档,我应该能够这样做:
<PropertyGroup>
<TargetFrameworks>net451;netstandard1.3</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试构建时,我得到了这些奇怪的错误:
无法从TargetFramework ='net451'推断出TargetFrameworkIdentifier和/或TargetFrameworkVersion.必须明确指定它们.
找不到MSB3645 .NET Framework v3.5 Service Pack 1.要以".NETFramework,Version = v1.3"为目标,必须安装.NET Framework v3.5 Service Pack 1或更高版本.
MSB3644找不到 框架".NETFramework,Version = v1.3"的引用程序集.要解决此问题,请为此框架版本安装SDK或Targeting Pack,或者将应用程序重新定位到已安装SDK或Targeting Pack的框架版本.请注意,程序集将从全局程序集缓存(GAC)中解析,并将用于代替引用程序集.因此,您的程序集可能无法正确定位到您想要的框架.
如果我手动指定目标框架标识符,它构建正常:
<PropertyGroup>
<TargetFrameworks>net451;netstandard1.3</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'net451'">
<TargetFrameworkIdentifier>.NETFramework</TargetFrameworkIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
<TargetFrameworkIdentifier>.NETStandard</TargetFrameworkIdentifier>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio 2017社区.我在这里做错了吗?