diff --git a/Build/Newtonsoft.Json.nuspec b/Build/Newtonsoft.Json.nuspec index 27eedf05..0b1eadb9 100644 --- a/Build/Newtonsoft.Json.nuspec +++ b/Build/Newtonsoft.Json.nuspec @@ -1,15 +1,47 @@  - - Newtonsoft.Json - - Json.NET - Json.NET is a popular high-performance JSON framework for .NET - James Newton-King - en-US - http://www.newtonsoft.com/json - http://www.newtonsoft.com/content/images/nugeticon.png - https://raw.github.com/JamesNK/Newtonsoft.Json/master/LICENSE.md - json - + + Newtonsoft.Json + + Json.NET + Json.NET is a popular high-performance JSON framework for .NET + James Newton-King + en-US + http://www.newtonsoft.com/json + http://www.newtonsoft.com/content/images/nugeticon.png + https://raw.github.com/JamesNK/Newtonsoft.Json/master/LICENSE.md + json + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Build/build.ps1 b/Build/build.ps1 index 7e6e6e86..a96bc7a1 100644 --- a/Build/build.ps1 +++ b/Build/build.ps1 @@ -1,8 +1,8 @@ properties { - $zipFileName = "Json80r3.zip" + $zipFileName = "Json80r4.zip" $majorVersion = "8.0" - $majorWithReleaseVersion = "8.0.3" - $nugetPrelease = $null + $majorWithReleaseVersion = "8.0.4" + $nugetPrelease = "beta4" $version = GetVersion $majorWithReleaseVersion $packageId = "Newtonsoft.Json" $signAssemblies = $false @@ -11,7 +11,7 @@ $buildNuGet = $true $treatWarningsAsErrors = $false $workingName = if ($workingName) {$workingName} else {"Working"} - $dnvmVersion = "1.0.0-rc1-update1" + $netCliVersion = "1.0.0-preview1-002702" $baseDir = resolve-path .. $buildDir = "$baseDir\Build" @@ -22,9 +22,9 @@ $workingDir = "$baseDir\$workingName" $workingSourceDir = "$workingDir\Src" $builds = @( - @{Name = "Newtonsoft.Json.Dotnet"; TestsName = "Newtonsoft.Json.Tests.Dotnet"; BuildFunction = "DnxBuild"; TestsFunction = "DnxTests"; Constants="dotnet"; FinalDir=$null; NuGetDir = $null; Framework=$null}, + @{Name = "Newtonsoft.Json.Dotnet"; TestsName = "Newtonsoft.Json.Tests.Dotnet"; BuildFunction = "NetCliBuild"; TestsFunction = "NetCliTests"; Constants="dotnet"; FinalDir="netstandard1.0"; NuGetDir = "netstandard1.0"; Framework=$null}, @{Name = "Newtonsoft.Json"; TestsName = "Newtonsoft.Json.Tests"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants=""; FinalDir="Net45"; NuGetDir = "net45"; Framework="net-4.0"}, - @{Name = "Newtonsoft.Json.Portable"; TestsName = "Newtonsoft.Json.Tests.Portable"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants="PORTABLE"; FinalDir="Portable"; NuGetDir = "portable-net45+wp80+win8+wpa81+dnxcore50"; Framework="net-4.0"}, + @{Name = "Newtonsoft.Json.Portable"; TestsName = "Newtonsoft.Json.Tests.Portable"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants="PORTABLE"; FinalDir="Portable"; NuGetDir = "portable-net45+wp80+win8+wpa81"; Framework="net-4.0"}, @{Name = "Newtonsoft.Json.Portable40"; TestsName = "Newtonsoft.Json.Tests.Portable40"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants="PORTABLE40"; FinalDir="Portable40"; NuGetDir = "portable-net40+sl5+wp80+win8+wpa81"; Framework="net-4.0"}, @{Name = "Newtonsoft.Json.Net40"; TestsName = "Newtonsoft.Json.Tests.Net40"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants="NET40"; FinalDir="Net40"; NuGetDir = "net40"; Framework="net-4.0"}, @{Name = "Newtonsoft.Json.Net35"; TestsName = "Newtonsoft.Json.Tests.Net35"; BuildFunction = "MSBuildBuild"; TestsFunction = "NUnitTests"; Constants="NET35"; FinalDir="Net35"; NuGetDir = "net35"; Framework="net-2.0"}, @@ -90,11 +90,7 @@ task Package -depends Build { if ($buildNuGet) { - $nugetVersion = $majorWithReleaseVersion - if ($nugetPrelease -ne $null) - { - $nugetVersion = $nugetVersion + "-" + $nugetPrelease - } + $nugetVersion = GetNuGetVersion New-Item -Path $workingDir\NuGet -ItemType Directory @@ -136,6 +132,7 @@ task Package -depends Build { Write-Host exec { .\Tools\NuGet\NuGet.exe pack $nuspecPath -Symbols } + exec { dotnet pack $workingSourceDir\Newtonsoft.Json\project.json -c Release } move -Path .\*.nupkg -Destination $workingDir\NuGet } @@ -204,36 +201,30 @@ function MSBuildBuild($build) exec { msbuild "/t:Clean;Rebuild" /p:Configuration=Release "/p:CopyNuGetImplementations=true" "/p:Platform=Any CPU" "/p:PlatformTarget=AnyCPU" /p:OutputPath=bin\Release\$finalDir\ /p:AssemblyOriginatorKeyFile=$signKeyPath "/p:SignAssembly=$signAssemblies" "/p:TreatWarningsAsErrors=$treatWarningsAsErrors" "/p:VisualStudioVersion=14.0" /p:DefineConstants=`"$constants`" "$workingSourceDir\$name.sln" | Out-Default } "Error building $name" } -function DnxBuild($build) +function NetCliBuild($build) { $name = $build.Name $projectPath = "$workingSourceDir\Newtonsoft.Json\project.json" - exec { dnvm install $dnvmVersion -r clr | Out-Default } - exec { dnvm use $dnvmVersion -r clr | Out-Default } + exec { .\Tools\Dotnet\install.ps1 -Version $netCliVersion | Out-Default } Write-Host -ForegroundColor Green "Restoring packages for $name" Write-Host - exec { dnu restore $projectPath | Out-Default } + exec { dotnet restore $projectPath | Out-Default } Write-Host -ForegroundColor Green "Building $projectPath" - exec { dnu build $projectPath --configuration Release | Out-Default } + exec { dotnet build $projectPath -f netstandard1.0 -c Release -o bin\Release\netstandard1.0 | Out-Default } } -function DnxTests($build) +function NetCliTests($build) { $name = $build.TestsName - #Write-Host -ForegroundColor Green "Ensuring latest CoreCLR is installed for $name" - #Write-Host - #exec { & $toolsDir\Kvm\kvm.ps1 upgrade -r CoreCLR -NoNative | Out-Default } - - exec { dnvm install $dnvmVersion -r coreclr | Out-Default } - exec { dnvm use $dnvmVersion -r coreclr | Out-Default } + exec { .\Tools\Dotnet\install.ps1 -Version $netCliVersion | Out-Default } Write-Host -ForegroundColor Green "Restoring packages for $name" Write-Host - exec { dnu restore "$workingSourceDir\Newtonsoft.Json.Tests\project.json" | Out-Default } + exec { dotnet restore "$workingSourceDir\Newtonsoft.Json.Tests\project.json" | Out-Default } Write-Host -ForegroundColor Green "Ensuring test project builds for $name" Write-Host @@ -241,7 +232,7 @@ function DnxTests($build) try { Set-Location "$workingSourceDir\Newtonsoft.Json.Tests" - exec { dnx --configuration Release test | Out-Default } + exec { dotnet test "$workingSourceDir\Newtonsoft.Json.Tests\project.json" -f netcoreapp1.0 -c Release -parallel none | Out-Default } } finally { @@ -266,6 +257,17 @@ function NUnitTests($build) exec { .\Tools\NUnit\nunit-console.exe "$workingDir\Deployed\Bin\$finalDir\Newtonsoft.Json.Tests.dll" /framework=$framework /xml:$workingDir\$name.xml | Out-Default } "Error running $name tests" } +function GetNuGetVersion() +{ + $nugetVersion = $majorWithReleaseVersion + if ($nugetPrelease -ne $null) + { + $nugetVersion = $nugetVersion + "-" + $nugetPrelease + } + + return $nugetVersion +} + function GetConstants($constants, $includeSigned) { $signed = switch($includeSigned) { $true { ";SIGNED" } default { "" } } @@ -345,9 +347,11 @@ function Update-Project { $file = switch($sign) { $true { $signKeyPath } default { $null } } $json = (Get-Content $projectPath) -join "`n" | ConvertFrom-Json - $options = @{"warningsAsErrors" = $true; "keyFile" = $file; "define" = ((GetConstants "dotnet" $sign) -split ";") } + $options = @{"warningsAsErrors" = $true; "xmlDoc" = $true; "keyFile" = $file; "define" = ((GetConstants "dotnet" $sign) -split ";") } Add-Member -InputObject $json -MemberType NoteProperty -Name "compilationOptions" -Value $options -Force + $json.version = GetNuGetVersion + ConvertTo-Json $json -Depth 10 | Set-Content $projectPath } diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index 846978b1..9356d94e 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -31,7 +31,9 @@ using System.Security; // set of attributes. Change these attribute values to modify the information // associated with an assembly. -#if PORTABLE40 +#if NETSTANDARD10 +[assembly: AssemblyTitle("Json.NET Tests .NET Standard 1.0")] +#elif PORTABLE40 [assembly: AssemblyTitle("Json.NET Tests Portable .NET 4.0")] #elif PORTABLE [assembly: AssemblyTitle("Json.NET Tests Portable")] diff --git a/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs index 8f4a0a62..ec1092f4 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/DefaultValueHandlingTests.cs @@ -27,7 +27,7 @@ using System; using System.ComponentModel; using System.IO; using System.Runtime.Serialization; -#if !(NET20 || NET35 || NETFX_CORE || PORTABLE) +#if !(NET20 || NET35 || NETFX_CORE || PORTABLE || DNXCORE50) using System.Runtime.Serialization.Json; #endif using System.Text; diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index cb37f805..b1342c77 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -5286,7 +5286,7 @@ Path '', line 1, position 1."); } #endif -#if !NETFX_CORE +#if !(NETFX_CORE || DNXCORE50) public class XmlNodeTestObject { public XmlDocument Document { get; set; } diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs index dad49a58..d16dc63f 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ReflectionAttributeProviderTests.cs @@ -71,7 +71,12 @@ namespace Newtonsoft.Json.Tests.Serialization [Test] public void GetAttributes_Property() { - PropertyInfo property = typeof(ReflectionTestObject).GetProperty("TestProperty"); + PropertyInfo property; +#if DNXCORE50 + property = Newtonsoft.Json.Utilities.TypeExtensions.GetProperty(typeof(ReflectionTestObject), "TestProperty"); +#else + property = typeof(ReflectionTestObject).GetProperty("TestProperty"); +#endif ReflectionAttributeProvider provider = new ReflectionAttributeProvider(property); @@ -85,7 +90,12 @@ namespace Newtonsoft.Json.Tests.Serialization [Test] public void GetAttributes_Field() { - FieldInfo field = (FieldInfo)typeof(ReflectionTestObject).GetField("TestField"); + FieldInfo field; +#if DNXCORE50 + field = (FieldInfo)Newtonsoft.Json.Utilities.TypeExtensions.GetField(typeof(ReflectionTestObject), "TestField"); +#else + field = typeof(ReflectionTestObject).GetField("TestField"); +#endif ReflectionAttributeProvider provider = new ReflectionAttributeProvider(field); diff --git a/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs index 1844246f..a3099970 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/SerializationErrorHandlingTests.cs @@ -74,11 +74,14 @@ namespace Newtonsoft.Json.Tests.Serialization var possibleMsgs = new[] { "[1] - Error message for member 1 = An item with the same key has already been added.", - "[1] - Error message for member 1 = An element with the same key already exists in the dictionary." // mono + "[1] - Error message for member 1 = An element with the same key already exists in the dictionary.", // mono + "[1] - Error message for member 1 = An item with the same key has already been added. Key: Jim" // netcore }; VersionKeyedCollection c = JsonConvert.DeserializeObject(json); Assert.AreEqual(1, c.Count); Assert.AreEqual(1, c.Messages.Count); + + Console.WriteLine(c.Messages[0]); Assert.IsTrue(possibleMsgs.Any(m => m == c.Messages[0]), "Expected One of: " + Environment.NewLine + string.Join(Environment.NewLine, possibleMsgs) + Environment.NewLine + "Was: " + Environment.NewLine + c.Messages[0]); } diff --git a/Src/Newtonsoft.Json.Tests/Serialization/WebApiIntegrationTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/WebApiIntegrationTests.cs index 6e748b1c..915e837f 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/WebApiIntegrationTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/WebApiIntegrationTests.cs @@ -41,7 +41,7 @@ using Assert = Newtonsoft.Json.Tests.XUnitAssert; #else using NUnit.Framework; #endif -#if !(NETFX_CORE || NET20 || NET35) +#if !(NETFX_CORE || NET20 || NET35 || DNXCORE50) using System.Runtime.Serialization.Json; #endif using Newtonsoft.Json.Serialization; diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/ListOfIds.cs b/Src/Newtonsoft.Json.Tests/TestObjects/ListOfIds.cs index 9333c511..23ef39cd 100644 --- a/Src/Newtonsoft.Json.Tests/TestObjects/ListOfIds.cs +++ b/Src/Newtonsoft.Json.Tests/TestObjects/ListOfIds.cs @@ -66,7 +66,11 @@ namespace Newtonsoft.Json.Tests.TestObjects public override bool CanConvert(Type objectType) { +#if DNXCORE50 + return Newtonsoft.Json.Utilities.TypeExtensions.IsAssignableFrom(typeof(IList), objectType); +#else return typeof(IList).IsAssignableFrom(objectType); +#endif } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/project.json b/Src/Newtonsoft.Json.Tests/project.json index 5c105e65..72897fff 100644 --- a/Src/Newtonsoft.Json.Tests/project.json +++ b/Src/Newtonsoft.Json.Tests/project.json @@ -7,11 +7,9 @@ "target": "project" } }, - "commands": { - "test": "xunit.runner.dnx -parallel none" - }, + "testRunner": "xunit", "frameworks": { - "net45": { + /*"net45": { "frameworkAssemblies": { "System.Collections": "", "System.ComponentModel.DataAnnotations": "", @@ -38,7 +36,6 @@ }, "net40": { "frameworkAssemblies": { - "System.Collections": "", "System.ComponentModel.DataAnnotations": "", "System.Data": "", "System.Data.DataSetExtensions": "", @@ -46,7 +43,6 @@ "System.Data.Linq": "", "System.Drawing": "", "System.Numerics": "", - "System.Runtime": "", "System.Runtime.Serialization": "", "System.Web": "", "System.Web.Extensions": "", @@ -87,40 +83,27 @@ "dependencies": { "NUnit": "2.6.4" } - }, - "dnxcore50": { + },*/ + "netcoreapp1.0": { + "compilationOptions": { + "define": [ "NETSTANDARD10", "DNXCORE50", "PORTABLE" ] + }, "dependencies": { - "Microsoft.CSharp": "4.0.0", - "System.Collections": "4.0.10", - "System.Collections.Immutable": "1.1.37", - "System.ComponentModel.TypeConverter": "4.0.0", - "System.Diagnostics.Debug": "4.0.10", - "System.Dynamic.Runtime": "4.0.10", - "System.Globalization": "4.0.10", - "System.IO": "4.0.10", - "System.Linq": "4.0.0", - "System.Linq.Expressions": "4.0.10", - "System.Reflection.Emit.ILGeneration": "4.0.0", - "System.Reflection.Extensions": "4.0.0", - "System.Reflection.TypeExtensions": "4.0.0", - "System.Runtime": "4.0.20", - "System.Runtime.Extensions": "4.0.10", - "System.Runtime.Numerics": "4.0.0", - "System.Runtime.Serialization.Json": "4.0.0", - "System.Runtime.Serialization.Primitives": "4.0.10", - "System.Runtime.Serialization.Xml": "4.0.10", - "System.Text.Encoding": "4.0.10", - "System.Text.Encoding.CodePages": "4.0.0", - "System.Text.Encoding.Extensions": "4.0.10", - "System.Text.RegularExpressions": "4.0.10", - "System.Threading": "4.0.10", - "System.Xml.ReaderWriter": "4.0.10", - "System.Xml.XDocument": "4.0.10", - "System.Xml.XmlDocument": "4.0.0", - "System.Xml.XmlSerializer": "4.0.10", - "xunit": "2.1.0-*", - "xunit.runner.dnx": "2.1.0-rc1-build204" - } + "Microsoft.NETCore.App": { + "type": "platform", + "version": "1.0.0-rc2-24027" + }, + "System.Runtime.Serialization.Primitives": "4.1.1-rc2-24027", + "System.Xml.XmlSerializer": "4.0.11-rc2-24027", + "System.Runtime.Serialization.Json": "4.0.2-rc2-24027", + "System.Runtime.Serialization.Xml": "4.1.1-rc2-24027", + "xunit": "2.1.0", + "dotnet-test-xunit": "1.0.0-rc2-173361-36" + }, + "imports": [ + "dnxcore50", + "portable-net45+win8" + ] } } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index bfc61ab8..62cc370e 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -32,7 +32,9 @@ using System.Security; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -#if PORTABLE40 +#if NETSTANDARD10 +[assembly: AssemblyTitle("Json.NET .NET Standard 1.0")] +#elif PORTABLE40 [assembly: AssemblyTitle("Json.NET Portable .NET 4.0")] #elif PORTABLE [assembly: AssemblyTitle("Json.NET Portable")] @@ -48,7 +50,6 @@ using System.Security; [assembly: AssemblyTitle("Json.NET .NET 4.0")] [assembly: AllowPartiallyTrustedCallers] #else - [assembly: AssemblyTitle("Json.NET")] [assembly: AllowPartiallyTrustedCallers] #endif diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs index bf970338..52c7b819 100644 --- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs +++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs @@ -40,7 +40,6 @@ using System.Runtime.Serialization; #if !(DOTNET || PORTABLE || PORTABLE40) using System.Security.Permissions; #endif -using System.Xml.Serialization; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; diff --git a/Src/Newtonsoft.Json/project.json b/Src/Newtonsoft.Json/project.json index 2b461622..b9a9e4b0 100644 --- a/Src/Newtonsoft.Json/project.json +++ b/Src/Newtonsoft.Json/project.json @@ -1,5 +1,5 @@ { - "version": "7.0.2-beta1", + "version": "1.0.0-*", "title": "Json.NET", "description": "Json.NET is a popular high-performance JSON framework for .NET", "authors": [ "James Newton-King" ], @@ -61,6 +61,7 @@ "System.ObjectModel": "", "System.Reflection": "", "System.Reflection.Extensions": "", + "System.Resources.ResourceManager": "", "System.Runtime": "", "System.Runtime.Extensions": "", "System.Runtime.Serialization": "", @@ -88,32 +89,33 @@ "System.Xml": "" } }, - "dotnet": { + "netstandard1.0": { + "compilationOptions": { + "define": [ "NETSTANDARD10", "PORTABLE" ] + }, "dependencies": { - "Microsoft.CSharp": "4.0.0", - "System.Collections": "4.0.10", - "System.Collections.Concurrent": "4.0.10", - "System.ComponentModel.TypeConverter": "4.0.0", - "System.Diagnostics.Debug": "4.0.10", - "System.Dynamic.Runtime": "4.0.10", - "System.Globalization": "4.0.10", - "System.IO": "4.0.10", - "System.Linq": "4.0.0", - "System.Linq.Expressions": "4.0.10", - "System.ObjectModel": "4.0.10", - "System.Reflection": "4.0.10", - "System.Reflection.Extensions": "4.0.0", - "System.Runtime": "4.0.20", - "System.Runtime.Extensions": "4.0.10", - "System.Runtime.Numerics": "4.0.0", - "System.Runtime.Serialization.Primitives": "4.0.10", - "System.Text.Encoding": "4.0.10", - "System.Text.Encoding.Extensions": "4.0.10", - "System.Text.RegularExpressions": "4.0.10", - "System.Threading": "4.0.10", - "System.Threading.Tasks": "4.0.10", - "System.Xml.ReaderWriter": "4.0.10", - "System.Xml.XDocument": "4.0.10" + "Microsoft.CSharp": "4.0.1-rc2-24027", + "System.Collections": "4.0.11-rc2-24027", + "System.Diagnostics.Debug": "4.0.11-rc2-24027", + "System.Dynamic.Runtime": "4.0.11-rc2-24027", + "System.Globalization": "4.0.11-rc2-24027", + "System.IO": "4.1.0-rc2-24027", + "System.Linq": "4.1.0-rc2-24027", + "System.Linq.Expressions": "4.0.11-rc2-24027", + "System.ObjectModel": "4.0.12-rc2-24027", + "System.Reflection": "4.1.0-rc2-24027", + "System.Reflection.Extensions": "4.0.1-rc2-24027", + "System.Resources.ResourceManager": "4.0.1-rc2-24027", + "System.Runtime": "4.1.0-rc2-24027", + "System.Runtime.Extensions": "4.1.0-rc2-24027", + "System.Runtime.Serialization.Primitives": "4.1.1-rc2-24027", + "System.Text.Encoding": "4.0.11-rc2-24027", + "System.Text.Encoding.Extensions": "4.0.11-rc2-24027", + "System.Text.RegularExpressions": "4.0.12-rc2-24027", + "System.Threading": "4.0.11-rc2-24027", + "System.Threading.Tasks": "4.0.11-rc2-24027", + "System.Xml.ReaderWriter": "4.0.11-rc2-24027", + "System.Xml.XDocument": "4.0.11-rc2-24027" } } } diff --git a/Src/NuGet.Config b/Src/NuGet.Config index 8b8ba5bc..1be2d76e 100644 --- a/Src/NuGet.Config +++ b/Src/NuGet.Config @@ -3,8 +3,8 @@ - - - + + + \ No newline at end of file diff --git a/Src/global.json b/Src/global.json index ae0a7539..0ddf69c7 100644 --- a/Src/global.json +++ b/Src/global.json @@ -1,6 +1,3 @@ { - "projects": [ "src" ], - "sdk": { - "version": "1.0.0-rc1-update1" - } -} + "projects": [ "src" ] +} \ No newline at end of file diff --git a/Tools/Dotnet/install.ps1 b/Tools/Dotnet/install.ps1 new file mode 100644 index 00000000..8b0ac72d --- /dev/null +++ b/Tools/Dotnet/install.ps1 @@ -0,0 +1,338 @@ +# +# Copyright (c) .NET Foundation and contributors. All rights reserved. +# Licensed under the MIT license. See LICENSE file in the project root for full license information. +# + +<# +.SYNOPSIS + Installs dotnet cli +.DESCRIPTION + Installs dotnet cli. If dotnet installation already exists in the given directory + it will update it only if the requested version differs from the one already installed. +.PARAMETER Channel + Default: preview + Channel is the way of reasoning about stability and quality of dotnet. This parameter takes one of the values: + - future - Possibly unstable, frequently changing, may contain new finished and unfinished features + - preview - Pre-release stable with known issues and feature gaps + - production - Most stable releases +.PARAMETER Version + Default: latest + Represents a build version on specific channel. Possible values: + - 4-part version in a format A.B.C.D - represents specific version of build + - latest - most latest build on specific channel + - lkg - last known good version on specific channel + Note: LKG work is in progress. Once the work is finished, this will become new default +.PARAMETER InstallDir + Default: %LocalAppData%\Microsoft\dotnet + Path to where to install dotnet. Note that binaries will be placed directly in a given directory. +.PARAMETER Architecture + Default: - this value represents currently running OS architecture + Architecture of dotnet binaries to be installed. + Possible values are: , x64 and x86 +.PARAMETER DebugSymbols + If set the installer will include symbols in the installation. +.PARAMETER DryRun + If set it will not perform installation but instead display what command line to use to consistently install + currently requested version of dotnet cli. In example if you specify version 'latest' it will display a link + with specific version so that this command can be used deterministicly in a build script. + It also displays binaries location if you prefer to install or download it yourself. +.PARAMETER NoPath + By default this script will set environment variable PATH for the current process to the binaries folder inside installation folder. + If set it will display binaries location but not set any environment variable. +.PARAMETER Verbose + Displays diagnostics information. +.PARAMETER AzureFeed + Default: https://dotnetcli.blob.core.windows.net/dotnet + This parameter should not be usually changed by user. It allows to change URL for the Azure feed used by this installer. +#> +[cmdletbinding()] +param( + [string]$Channel="preview", + [string]$Version="Latest", + [string]$InstallDir="", + [string]$Architecture="", + [switch]$DebugSymbols, # TODO: Switch does not work yet. Symbols zip is not being uploaded yet. + [switch]$DryRun, + [switch]$NoPath, + [string]$AzureFeed="https://dotnetcli.blob.core.windows.net/dotnet" +) + +Set-StrictMode -Version Latest +$ErrorActionPreference="Stop" +$ProgressPreference="SilentlyContinue" + +$BinFolderRelativePath="" + +# example path with regex: shared/1.0.0-beta-12345/somepath +$VersionRegEx="/\d+\.\d+[^/]+/" +$OverrideNonVersionedFiles=$true + +function Say($str) { + Write-Host "dotnet_install: $str" +} + +function Say-Verbose($str) { + Write-Verbose "dotnet_install: $str" +} + +function Say-Invocation($Invocation) { + $command = $Invocation.MyCommand; + $args = (($Invocation.BoundParameters.Keys | foreach { "-$_ `"$($Invocation.BoundParameters[$_])`"" }) -join " ") + Say-Verbose "$command $args" +} + +function Get-Machine-Architecture() { + Say-Invocation $MyInvocation + + # possible values: AMD64, IA64, x86 + return $ENV:PROCESSOR_ARCHITECTURE +} + +# TODO: Architecture and CLIArchitecture should be unified +function Get-CLIArchitecture-From-Architecture([string]$Architecture) { + Say-Invocation $MyInvocation + + switch ($Architecture.ToLower()) { + { $_ -eq "" } { return Get-CLIArchitecture-From-Architecture $(Get-Machine-Architecture) } + { ($_ -eq "amd64") -or ($_ -eq "x64") } { return "x64" } + { $_ -eq "x86" } { return "x86" } + default { throw "Architecture not supported. If you think this is a bug, please report it at https://github.com/dotnet/cli/issues" } + } +} + +function Get-Version-Info-From-Version-Text([string]$VersionText) { + Say-Invocation $MyInvocation + + $Data = @($VersionText.Split([char[]]@(), [StringSplitOptions]::RemoveEmptyEntries)); + + $VersionInfo = @{} + $VersionInfo.CommitHash = $Data[0].Trim() + $VersionInfo.Version = $Data[1].Trim() + return $VersionInfo +} + +function Get-Latest-Version-Info([string]$AzureFeed, [string]$AzureChannel, [string]$CLIArchitecture) { + Say-Invocation $MyInvocation + + $VersionFileUrl = "$AzureFeed/$AzureChannel/dnvm/latest.win.$CLIArchitecture.version" + $Response = Invoke-WebRequest -UseBasicParsing $VersionFileUrl + $VersionText = [Text.Encoding]::UTF8.GetString($Response.Content) + + $VersionInfo = Get-Version-Info-From-Version-Text $VersionText + + return $VersionInfo +} + +# TODO: AzureChannel and Channel should be unified +function Get-Azure-Channel-From-Channel([string]$Channel) { + Say-Invocation $MyInvocation + + # For compatibility with build scripts accept also directly Azure channels names + switch ($Channel.ToLower()) { + { ($_ -eq "future") -or ($_ -eq "dev") } { return "dev" } + { ($_ -eq "preview") -or ($_ -eq "beta") } { return "beta" } + { $_ -eq "production" } { throw "Production channel does not exist yet" } + default { throw "``$Channel`` is an invalid channel name. Use one of the following: ``future``, ``preview``, ``production``" } + } +} + +function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$AzureChannel, [string]$CLIArchitecture, [string]$Version) { + Say-Invocation $MyInvocation + + switch ($Version.ToLower()) { + { $_ -eq "latest" } { + $LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -AzureChannel $AzureChannel -CLIArchitecture $CLIArchitecture + return $LatestVersionInfo.Version + } + { $_ -eq "lkg" } { throw "``-Version LKG`` not supported yet." } + default { return $Version } + } +} + +function Get-Download-Links([string]$AzureFeed, [string]$AzureChannel, [string]$SpecificVersion, [string]$CLIArchitecture) { + Say-Invocation $MyInvocation + + $ret = @() + $files = @("dotnet-dev") + + foreach ($file in $files) { + $PayloadURL = "$AzureFeed/$AzureChannel/Binaries/$SpecificVersion/$file-win-$CLIArchitecture.$SpecificVersion.zip" + Say-Verbose "Constructed payload URL: $PayloadURL" + $ret += $PayloadURL + } + + return $ret +} + +function Get-User-Share-Path() { + Say-Invocation $MyInvocation + + $InstallRoot = $env:DOTNET_INSTALL_DIR + if (!$InstallRoot) { + $InstallRoot = "$env:LocalAppData\Microsoft\dotnet" + } + return $InstallRoot +} + +function Resolve-Installation-Path([string]$InstallDir) { + Say-Invocation $MyInvocation + + if ($InstallDir -eq "") { + return Get-User-Share-Path + } + return $InstallDir +} + +function Get-Version-Info-From-Version-File([string]$InstallRoot, [string]$RelativePathToVersionFile) { + Say-Invocation $MyInvocation + + $VersionFile = Join-Path -Path $InstallRoot -ChildPath $RelativePathToVersionFile + Say-Verbose "Local version file: $VersionFile" + + if (Test-Path $VersionFile) { + $VersionText = cat $VersionFile + Say-Verbose "Local version file text: $VersionText" + return Get-Version-Info-From-Version-Text $VersionText + } + + Say-Verbose "Local version file not found." + + return $null +} + +function Is-Dotnet-Package-Installed([string]$InstallRoot, [string]$RelativePathToPackage, [string]$SpecificVersion) { + Say-Invocation $MyInvocation + + $DotnetPackagePath = Join-Path -Path $InstallRoot -ChildPath $RelativePathToPackage | Join-Path -ChildPath $SpecificVersion + Say-Verbose "Is-Dotnet-Package-Installed: Path to a package: $DotnetPackagePath" + return Test-Path $DotnetPackagePath -PathType Container +} + +function Get-Absolute-Path([string]$RelativeOrAbsolutePath) { + # Too much spam + # Say-Invocation $MyInvocation + + return $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($RelativeOrAbsolutePath) +} + +function Get-Path-Prefix-With-Version($path) { + $match = [regex]::match($path, $VersionRegEx) + if ($match.Success) { + return $entry.FullName.Substring(0, $match.Index + $match.Length) + } + + return $null +} + +function Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package([System.IO.Compression.ZipArchive]$Zip, [string]$OutPath) { + Say-Invocation $MyInvocation + + $ret = @() + foreach ($entry in $Zip.Entries) { + $dir = Get-Path-Prefix-With-Version $entry.FullName + if ($dir -ne $null) { + $path = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $dir) + if (-Not (Test-Path $path -PathType Container)) { + $ret += $dir + } + } + } + + $ret = $ret | Sort-Object | Get-Unique + + $values = ($ret | foreach { "$_" }) -join ";" + Say-Verbose "Directories to unpack: $values" + + return $ret +} + +# Example zip content and extraction algorithm: +# Rule: files if extracted are always being extracted to the same relative path locally +# .\ +# a.exe # file does not exist locally, extract +# b.dll # file exists locally, override only if $OverrideFiles set +# aaa\ # same rules as for files +# ... +# abc\1.0.0\ # directory contains version and exists locally +# ... # do not extract content under versioned part +# abc\asd\ # same rules as for files +# ... +# def\ghi\1.0.1\ # directory contains version and does not exist locally +# ... # extract content +function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) { + Say-Invocation $MyInvocation + + Add-Type -Assembly System.IO.Compression.FileSystem | Out-Null + Set-Variable -Name Zip + try { + $Zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath) + + $DirectoriesToUnpack = Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package -Zip $Zip -OutPath $OutPath + + foreach ($entry in $Zip.Entries) { + $PathWithVersion = Get-Path-Prefix-With-Version $entry.FullName + if (($PathWithVersion -eq $null) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) { + $DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName) + $DestinationDir = Split-Path -Parent $DestinationPath + $OverrideFiles=$OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath)) + if ((-Not $DestinationPath.EndsWith("\")) -And $OverrideFiles) { + New-Item -ItemType Directory -Force -Path $DestinationDir | Out-Null + [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $DestinationPath, $OverrideNonVersionedFiles) + } + } + } + } + finally { + if ($Zip -ne $null) { + $Zip.Dispose() + } + } +} + +$AzureChannel = Get-Azure-Channel-From-Channel -Channel $Channel +$CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture +$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -AzureChannel $AzureChannel -CLIArchitecture $CLIArchitecture -Version $Version +$DownloadLinks = Get-Download-Links -AzureFeed $AzureFeed -AzureChannel $AzureChannel -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture + +if ($DryRun) { + Say "Payload URLs:" + foreach ($DownloadLink in $DownloadLinks) { + Say "- $DownloadLink" + } + Say "Repeatable invocation: .\$($MyInvocation.MyCommand) -Version $SpecificVersion -Channel $Channel -Architecture $CLIArchitecture -InstallDir $InstallDir" + return +} + +$InstallRoot = Resolve-Installation-Path $InstallDir +Say-Verbose "InstallRoot: $InstallRoot" + +$IsSdkInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage "sdk" -SpecificVersion $SpecificVersion +Say-Verbose ".NET SDK installed? $IsSdkInstalled" +if ($IsSdkInstalled) { + Say ".NET SDK version $SpecificVersion is already installed." + return +} + +New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null + +foreach ($DownloadLink in $DownloadLinks) { + $ZipPath = [System.IO.Path]::GetTempFileName() + Say "Downloading $DownloadLink" + $resp = Invoke-WebRequest -UseBasicParsing $DownloadLink -OutFile $ZipPath + + Say "Extracting zip from $DownloadLink" + Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot + + Remove-Item $ZipPath +} + +$BinPath = Get-Absolute-Path $(Join-Path -Path $InstallRoot -ChildPath $BinFolderRelativePath) +if (-Not $NoPath) { + Say "Adding to current process PATH: `"$BinPath`". Note: This change will not be visible if PowerShell was run as a child process." + $env:path += ";$BinPath" +} +else { + Say "Binaries of dotnet can be found in $BinPath" +} + +Say "Installation finished" diff --git a/Tools/NuGet/NuGet.exe b/Tools/NuGet/NuGet.exe index 9f8781de..31fc9885 100644 Binary files a/Tools/NuGet/NuGet.exe and b/Tools/NuGet/NuGet.exe differ