diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/Program.cs
new file mode 100644
index 000000000..51233cffa
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/project.json
new file mode 100644
index 000000000..9f677856d
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompilationOptions/project.json
@@ -0,0 +1,20 @@
+{
+ "version": "1.0.0-*",
+ "compilerName": "csc",
+ "compilationOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn1.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn1.cs
new file mode 100644
index 000000000..042fc53d1
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn1.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class HelperBuiltIn1
+ {
+ public static string GetMessage()
+ {
+ return "Hello from HelperBuiltIn1 class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn2.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn2.cs
new file mode 100644
index 000000000..5ba00add3
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/HelperBuiltIn2.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class HelperBuiltIn2
+ {
+ public static string GetMessage()
+ {
+ return "Hello from HelperBuiltIn2 class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/IncludeThis.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/IncludeThis.cs
new file mode 100644
index 000000000..d9300fe2d
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/IncludeThis.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class IncludeThis
+ {
+ public static string GetMessage()
+ {
+ return "Hello from IncludeThis class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/Program.cs
new file mode 100644
index 000000000..bf3f8b064
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/Program.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine(IncludeThis.GetMessage());
+ Console.WriteLine(HelperBuiltIn1.GetMessage());
+ Console.WriteLine(HelperBuiltIn2.GetMessage());
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/project.json
new file mode 100644
index 000000000..7418df38c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileBuiltInOptions/project/project.json
@@ -0,0 +1,20 @@
+{
+ "version": "1.0.0-*",
+ "compileBuiltIn": [ "Program.cs", "IncludeThis.cs", "../HelperBuiltIn1.cs", "../HelperBuiltIn2.cs" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis1.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis1.cs
new file mode 100644
index 000000000..c8ee6c75e
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis1.cs
@@ -0,0 +1 @@
+This does not compile but is used to test compile exclusion.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis2.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis2.cs
new file mode 100644
index 000000000..c8ee6c75e
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/ExcludeThis2.cs
@@ -0,0 +1 @@
+This does not compile but is used to test compile exclusion.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/Program.cs
new file mode 100644
index 000000000..51233cffa
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/project.json
new file mode 100644
index 000000000..3b457a6dc
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileExcludeOptions/project.json
@@ -0,0 +1,21 @@
+{
+ "version": "1.0.0-*",
+ "compileExclude": "ExcludeThis1.cs",
+ "exclude": [ "ExcludeThis2.cs" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper1.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper1.cs
new file mode 100644
index 000000000..dd2447c0f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper1.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Helper1
+ {
+ public static string GetMessage()
+ {
+ return "Hello from Helper1 class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper2.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper2.cs
new file mode 100644
index 000000000..eeabb8a3d
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/Helper2.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Helper2
+ {
+ public static string GetMessage()
+ {
+ return "Hello from Helper2 class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/IncludeThis.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/IncludeThis.cs
new file mode 100644
index 000000000..d9300fe2d
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/IncludeThis.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class IncludeThis
+ {
+ public static string GetMessage()
+ {
+ return "Hello from IncludeThis class!";
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/Program.cs
new file mode 100644
index 000000000..67d7bea12
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/Program.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine(IncludeThis.GetMessage());
+ Console.WriteLine(Helper1.GetMessage());
+ Console.WriteLine(Helper2.GetMessage());
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/project.json
new file mode 100644
index 000000000..87eeadaa3
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedCompileOptions/project/project.json
@@ -0,0 +1,21 @@
+{
+ "version": "1.0.0-*",
+ "compile": "../Helper1.cs",
+ "compileFiles": "../Helper2.cs",
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile1.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile1.txt
new file mode 100644
index 000000000..49852374c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile1.txt
@@ -0,0 +1 @@
+Test content file that should be included.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile2.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile2.txt
new file mode 100644
index 000000000..49852374c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFile2.txt
@@ -0,0 +1 @@
+Test content file that should be included.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn1.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn1.txt
new file mode 100644
index 000000000..49852374c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn1.txt
@@ -0,0 +1 @@
+Test content file that should be included.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn2.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn2.txt
new file mode 100644
index 000000000..49852374c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/ContentFileBuiltIn2.txt
@@ -0,0 +1 @@
+Test content file that should be included.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis1.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis1.txt
new file mode 100644
index 000000000..949ca7b7c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis1.txt
@@ -0,0 +1 @@
+Test content file that should be excluded.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis2.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis2.txt
new file mode 100644
index 000000000..949ca7b7c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/ExcludeThis2.txt
@@ -0,0 +1 @@
+Test content file that should be excluded.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/IncludeThis.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/IncludeThis.txt
new file mode 100644
index 000000000..49852374c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/IncludeThis.txt
@@ -0,0 +1 @@
+Test content file that should be included.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/Program.cs
new file mode 100644
index 000000000..51233cffa
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/project.json
new file mode 100644
index 000000000..bf61a22e2
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedContentOptions/project/project.json
@@ -0,0 +1,24 @@
+{
+ "version": "1.0.0-*",
+ "content": "*.txt",
+ "contentExclude": "ExcludeThis1.txt",
+ "contentFiles": [ "../ContentFile1.txt", "../ContentFile2.txt" ],
+ "contentBuiltIn": [ "../ContentFileBuiltIn1.txt", "../ContentFileBuiltIn2.txt" ],
+ "publishExclude": "ExcludeThis2.txt",
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/Program.cs
new file mode 100644
index 000000000..d0134277c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ var thisAssembly = typeof(Program).GetTypeInfo().Assembly;
+ var resources = from resourceName in thisAssembly.GetManifestResourceNames()
+ select resourceName;
+
+ var resourceNames = string.Join(",", resources);
+ Console.WriteLine($"{resources.Count()} Resources Found: {resourceNames}");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json
new file mode 100644
index 000000000..0bf0dfa00
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedNamedResourceOption/project.json
@@ -0,0 +1,20 @@
+{
+ "version": "1.0.0-*",
+ "namedResource": [ "My.Alias", "Strings.resx" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.0"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content1.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content1.txt
new file mode 100644
index 000000000..a36501f3f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content1.txt
@@ -0,0 +1 @@
+Test pack content file.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content2.txt b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content2.txt
new file mode 100644
index 000000000..a36501f3f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Content2.txt
@@ -0,0 +1 @@
+Test pack content file.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Program.cs
new file mode 100644
index 000000000..51233cffa
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/Program.cs
@@ -0,0 +1,12 @@
+using System;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/project.json
new file mode 100644
index 000000000..5daf77a20
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedPackOptions/project.json
@@ -0,0 +1,32 @@
+{
+ "version": "1.0.0-*",
+ "projectUrl": "http://projecturl/",
+ "licenseUrl": "http://licenseurl/",
+ "iconUrl": "http://iconurl/",
+ "owners": [ "owner1", "owner2" ],
+ "tags": [ "tag1", "tag2" ],
+ "releaseNotes": "releaseNotes",
+ "requireLicenseAcceptance": true,
+ "summary": "summary",
+ "repository": {
+ "type": "git",
+ "url": "http://url/"
+ },
+ "packInclude": [ "Content1.txt", "Content2.txt" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.1"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings1.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings1.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings1.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings2.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings2.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/Strings2.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Program.cs
new file mode 100644
index 000000000..d0134277c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ var thisAssembly = typeof(Program).GetTypeInfo().Assembly;
+ var resources = from resourceName in thisAssembly.GetManifestResourceNames()
+ select resourceName;
+
+ var resourceNames = string.Join(",", resources);
+ Console.WriteLine($"{resources.Count()} Resources Found: {resourceNames}");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Resources/Strings.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Resources/Strings.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/Resources/Strings.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/project.json
new file mode 100644
index 000000000..d4f8ee07f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceBuiltInOptions/project/project.json
@@ -0,0 +1,20 @@
+{
+ "version": "1.0.0-*",
+ "resourceBuiltIn": [ "../Strings1.resx", "../Strings2.resx" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.0"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude1.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude1.resx
new file mode 100644
index 000000000..a82c91ddd
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude1.resx
@@ -0,0 +1 @@
+This is not a resource file but is used to test resource exclusion.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude2.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude2.resx
new file mode 100644
index 000000000..a82c91ddd
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Exclude2.resx
@@ -0,0 +1 @@
+This is not a resource file but is used to test resource exclusion.
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Program.cs
new file mode 100644
index 000000000..d0134277c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ var thisAssembly = typeof(Program).GetTypeInfo().Assembly;
+ var resources = from resourceName in thisAssembly.GetManifestResourceNames()
+ select resourceName;
+
+ var resourceNames = string.Join(",", resources);
+ Console.WriteLine($"{resources.Count()} Resources Found: {resourceNames}");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/project.json
new file mode 100644
index 000000000..01c3c9e23
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceExcludeOptions/project.json
@@ -0,0 +1,21 @@
+{
+ "version": "1.0.0-*",
+ "exclude": "Exclude1.resx",
+ "resourceExclude": [ "Exclude2.resx" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.0"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings1.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings1.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings1.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings2.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings2.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/Strings2.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs
new file mode 100644
index 000000000..d0134277c
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace ConsoleApplication
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ var thisAssembly = typeof(Program).GetTypeInfo().Assembly;
+ var resources = from resourceName in thisAssembly.GetManifestResourceNames()
+ select resourceName;
+
+ var resourceNames = string.Join(",", resources);
+ Console.WriteLine($"{resources.Count()} Resources Found: {resourceNames}");
+ }
+ }
+}
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Resources/Strings.resx b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Resources/Strings.resx
new file mode 100644
index 000000000..1f24a372f
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/Resources/Strings.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Hello World!
+
+
\ No newline at end of file
diff --git a/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/project.json b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/project.json
new file mode 100644
index 000000000..369f7325d
--- /dev/null
+++ b/TestAssets/NonRestoredTestProjects/PJAppWithDeprecatedResourceOptions/project/project.json
@@ -0,0 +1,21 @@
+{
+ "version": "1.0.0-*",
+ "resource": "../Strings1.resx",
+ "resourceFiles": [ "../Strings2.resx" ],
+ "buildOptions": {
+ "debugType": "portable",
+ "emitEntryPoint": true
+ },
+ "dependencies": {},
+ "frameworks": {
+ "netcoreapp1.0": {
+ "dependencies": {
+ "Microsoft.NETCore.App": {
+ "type": "platform",
+ "version": "1.0.0"
+ }
+ },
+ "imports": "dnxcore50"
+ }
+ }
+}
diff --git a/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/.noautobuild b/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/.noautobuild
deleted file mode 100644
index e69de29bb..000000000
diff --git a/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/Helper.cs b/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/Helper.cs
deleted file mode 100644
index bd9a33ffe..000000000
--- a/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/Helper.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-// 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.
-
-using System;
-
-namespace TestLibrary
-{
- public static class Helper
- {
- public static void SayHi()
- {
- Console.WriteLine("Hello there!");
- }
- }
-}
diff --git a/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/project.json b/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/project.json
deleted file mode 100644
index 90cf856ff..000000000
--- a/TestAssets/TestProjects/TestLibraryWithDeprecatedProjectFile/project.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "version": "1.0.0-*",
- "compilationOptions": {
- "xmlDoc": true
- },
- "packInclude": {},
- "dependencies": {
- "NETStandard.Library": "1.6.0"
- },
- "frameworks": {
- "netstandard1.5": {}
- }
-}
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/ProjectReader.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/ProjectReader.cs
index 57583883e..7a2778d9c 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/ProjectReader.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/Microsoft.DotNet.Internal.ProjectModel/ProjectReader.cs
@@ -165,7 +165,8 @@ namespace Microsoft.DotNet.Internal.ProjectModel
// Project files
project.Files = new ProjectFilesCollection(rawProject, project.ProjectDirectory, project.ProjectFilePath);
- AddProjectFilesCollectionDiagnostics(rawProject, project);
+ AddProjectFilesDeprecationDiagnostics(rawProject, project);
+ ConvertDeprecatedToSupportedFormat(rawProject);
var commands = rawProject.Value("commands") as JObject;
if (commands != null)
@@ -758,10 +759,14 @@ namespace Microsoft.DotNet.Internal.ProjectModel
if (rawPackOptions != null)
{
- var packOptionValue = rawPackOptions.Value(option);
- if (packOptionValue != null)
+ var hasOption = rawPackOptions.Value(option) != null;
+ if (hasOption)
{
- return packOptionValue;
+ var packOptionValue = rawPackOptions.Value(option);
+ if (packOptionValue != null)
+ {
+ return packOptionValue;
+ }
}
}
@@ -807,37 +812,45 @@ namespace Microsoft.DotNet.Internal.ProjectModel
return File.Exists(projectPath);
}
- private static void AddProjectFilesCollectionDiagnostics(JObject rawProject, Project project)
+ private static void AddProjectFilesDeprecationDiagnostics(JObject rawProject, Project project)
{
var compileWarning = "'compile' in 'buildOptions'";
- AddDiagnosticMesage(rawProject, project, "compile", compileWarning);
- AddDiagnosticMesage(rawProject, project, "compileExclude", compileWarning);
- AddDiagnosticMesage(rawProject, project, "compileFiles", compileWarning);
- AddDiagnosticMesage(rawProject, project, "compileBuiltIn", compileWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "compile", compileWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "compileExclude", compileWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "compileFiles", compileWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "compileBuiltIn", compileWarning);
var resourceWarning = "'embed' in 'buildOptions'";
- AddDiagnosticMesage(rawProject, project, "resource", resourceWarning);
- AddDiagnosticMesage(rawProject, project, "resourceExclude", resourceWarning);
- AddDiagnosticMesage(rawProject, project, "resourceFiles", resourceWarning);
- AddDiagnosticMesage(rawProject, project, "resourceBuiltIn", resourceWarning);
- AddDiagnosticMesage(rawProject, project, "namedResource", resourceWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "resource", resourceWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "resourceExclude", resourceWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "resourceFiles", resourceWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "resourceBuiltIn", resourceWarning);
+ // Issue: https://github.com/dotnet/cli/issues/5471
+ // This is why we mark it as an error which will fail migration.
+ AddDeprecatedDiagnosticMessage(
+ rawProject,
+ project,
+ "namedResource",
+ resourceWarning,
+ DiagnosticMessageSeverity.Error);
var contentWarning = "'publishOptions' to publish or 'copyToOutput' in 'buildOptions' to copy to build output";
- AddDiagnosticMesage(rawProject, project, "content", contentWarning);
- AddDiagnosticMesage(rawProject, project, "contentExclude", contentWarning);
- AddDiagnosticMesage(rawProject, project, "contentFiles", contentWarning);
- AddDiagnosticMesage(rawProject, project, "contentBuiltIn", contentWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "content", contentWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "contentExclude", contentWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "contentFiles", contentWarning);
+ AddDeprecatedDiagnosticMessage(rawProject, project, "contentBuiltIn", contentWarning);
- AddDiagnosticMesage(rawProject, project, "packInclude", "'files' in 'packOptions'");
- AddDiagnosticMesage(rawProject, project, "publishExclude", "'publishOptions'");
- AddDiagnosticMesage(rawProject, project, "exclude", "'exclude' within 'compile' or 'embed'");
+ AddDeprecatedDiagnosticMessage(rawProject, project, "packInclude", "'files' in 'packOptions'");
+ AddDeprecatedDiagnosticMessage(rawProject, project, "publishExclude", "'publishOptions'");
+ AddDeprecatedDiagnosticMessage(rawProject, project, "exclude", "'exclude' within 'compile' or 'embed'");
}
- private static void AddDiagnosticMesage(
+ private static void AddDeprecatedDiagnosticMessage(
JObject rawProject,
Project project,
string option,
- string message)
+ string message,
+ DiagnosticMessageSeverity severity = DiagnosticMessageSeverity.Warning)
{
var lineInfo = rawProject.Value(option);
if (lineInfo == null)
@@ -850,11 +863,132 @@ namespace Microsoft.DotNet.Internal.ProjectModel
ErrorCodes.DOTNET1015,
$"The '{option}' option is deprecated. Use {message} instead.",
project.ProjectFilePath,
- DiagnosticMessageSeverity.Warning,
+ severity,
lineInfo.LineNumber,
lineInfo.LinePosition));
}
+ private static void ConvertDeprecatedToSupportedFormat(JObject rawProject)
+ {
+ ConvertToBuildOptionsCompile(rawProject);
+ ConvertToBuildOptionsEmbed(rawProject);
+ ConvertToBuildOptionsCopyToOutput(rawProject);
+ ConvertToPackOptions(rawProject);
+ ConvertToPublishOptions(rawProject);
+ }
+
+ private static void ConvertToBuildOptionsCompile(JObject rawProject)
+ {
+ var jpath = "buildOptions.compile";
+ if (AreDeprecatedOptionsIgnored(rawProject, jpath))
+ {
+ return;
+ }
+
+ ConvertFromDeprecatedFormat(rawProject, jpath, "compile", "include");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "exclude", "exclude");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "compileExclude", "excludeFiles");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "compileFiles", "includeFiles");
+ ConvertFromDeprecatedFormat(rawProject, $"{jpath}.builtIns", "compileBuiltIn", "include");
+ }
+
+ private static void ConvertToBuildOptionsEmbed(JObject rawProject)
+ {
+ var jpath = "buildOptions.embed";
+ if (AreDeprecatedOptionsIgnored(rawProject, jpath))
+ {
+ return;
+ }
+
+ ConvertFromDeprecatedFormat(rawProject, jpath, "resource", "include");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "exclude", "exclude");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "resourceExclude", "excludeFiles");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "resourceFiles", "includeFiles");
+ ConvertFromDeprecatedFormat(rawProject, $"{jpath}.builtIns", "resourceBuiltIn", "include");
+ }
+
+ private static void ConvertToBuildOptionsCopyToOutput(JObject rawProject)
+ {
+ var jpath = "buildOptions.copyToOutput";
+ if (AreDeprecatedOptionsIgnored(rawProject, jpath))
+ {
+ return;
+ }
+
+ ConvertFromDeprecatedFormat(rawProject, jpath, "content", "include");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "contentExclude", "excludeFiles");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "contentFiles", "includeFiles");
+ ConvertFromDeprecatedFormat(rawProject, $"{jpath}.builtIns", "contentBuiltIn", "include");
+ }
+
+ private static void ConvertToPackOptions(JObject rawProject)
+ {
+ var jpath = "packOptions";
+ if (AreDeprecatedOptionsIgnored(rawProject, jpath))
+ {
+ return;
+ }
+
+ ConvertFromDeprecatedFormat(rawProject, $"{jpath}.files", "packInclude", "include");
+ }
+
+ private static void ConvertToPublishOptions(JObject rawProject)
+ {
+ var jpath = "publishOptions";
+ if (AreDeprecatedOptionsIgnored(rawProject, jpath))
+ {
+ return;
+ }
+
+ ConvertFromDeprecatedFormat(rawProject, jpath, "content", "include");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "publishExclude", "exclude");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "contentExclude", "excludeFiles");
+ ConvertFromDeprecatedFormat(rawProject, jpath, "contentFiles", "includeFiles");
+ ConvertFromDeprecatedFormat(rawProject, $"{jpath}.builtIns", "contentBuiltIn", "include");
+ }
+
+ private static bool AreDeprecatedOptionsIgnored(JObject rawProject, string jpathToNewFormatObject)
+ {
+ // If the node already exists this means that the project.json file contained both the old and
+ // new format. In these cases the project.json build ignores the deprecated format and just uses
+ // the new format.
+ return (rawProject.SelectToken(jpathToNewFormatObject) != null);
+ }
+
+ private static void ConvertFromDeprecatedFormat(
+ JObject rawProject,
+ string jpathToObject,
+ string deprecatedKey,
+ string newKey
+ )
+ {
+ var deprecatedValue = rawProject.Value(deprecatedKey);
+ if (deprecatedValue != null)
+ {
+ var objectNode = GetOrCreateObjectHierarchy(rawProject, jpathToObject);
+ objectNode[newKey] = deprecatedValue.DeepClone();
+ }
+ }
+
+ private static JObject GetOrCreateObjectHierarchy(JObject rawProject, string jpath)
+ {
+ var currentObject = rawProject as JObject;
+
+ var objectHierarchy = jpath.Split('.');
+ foreach (var name in objectHierarchy)
+ {
+ var childObject = currentObject.Value(name);
+ if (childObject == null)
+ {
+ childObject = new JObject();
+ currentObject[name] = childObject;
+ }
+ currentObject = childObject;
+ }
+
+ return currentObject;
+ }
+
private static bool TryGetStringEnumerable(JToken token, out IEnumerable result)
{
IEnumerable values;
diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectMigrator.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectMigrator.cs
index 2596d8f2f..2554ee9c8 100644
--- a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectMigrator.cs
+++ b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectMigrator.cs
@@ -9,6 +9,7 @@ using Microsoft.Build.Construction;
using Microsoft.DotNet.Internal.ProjectModel;
using Microsoft.DotNet.Internal.ProjectModel.Graph;
using Microsoft.DotNet.Cli;
+using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.Cli.Utils.ExceptionExtensions;
using Microsoft.DotNet.Cli.Sln.Internal;
using Microsoft.DotNet.ProjectJsonMigration.Rules;
@@ -41,10 +42,11 @@ namespace Microsoft.DotNet.ProjectJsonMigration
IEnumerable projectDependencies = null;
var projectMigrationReports = new List();
+ List warnings = null;
try
{
// Verify up front so we can prefer these errors over an unresolved project dependency
- VerifyInputs(rootInputs, rootSettings);
+ VerifyInputs(rootInputs, rootSettings, out warnings);
projectMigrationReports.Add(MigrateProject(rootSettings));
@@ -67,7 +69,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
rootSettings.ProjectDirectory,
rootInputs?.DefaultProjectContext?.GetProjectName(),
new List {e.Error},
- null)
+ warnings)
});
}
@@ -143,6 +145,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
var projectName = migrationRuleInputs.DefaultProjectContext.GetProjectName();
var outputProject = Path.Combine(migrationSettings.OutputDirectory, projectName + ".csproj");
+ List warnings = null;
try
{
if (File.Exists(outputProject))
@@ -165,7 +168,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
}
}
- VerifyInputs(migrationRuleInputs, migrationSettings);
+ VerifyInputs(migrationRuleInputs, migrationSettings, out warnings);
SetupOutputDirectory(migrationSettings.ProjectDirectory, migrationSettings.OutputDirectory);
@@ -178,7 +181,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
exc.Error
};
- return new ProjectMigrationReport(migrationSettings.ProjectDirectory, projectName, error, null);
+ return new ProjectMigrationReport(migrationSettings.ProjectDirectory, projectName, error, warnings);
}
List csprojDependencies = null;
@@ -207,7 +210,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
projectName,
outputProject,
null,
- null,
+ warnings,
csprojDependencies);
}
@@ -234,13 +237,22 @@ namespace Microsoft.DotNet.ProjectJsonMigration
return new MigrationRuleInputs(projectContexts, templateMSBuildProject, itemGroup, propertyGroup, xproj);
}
- private void VerifyInputs(MigrationRuleInputs migrationRuleInputs, MigrationSettings migrationSettings)
+ private void VerifyInputs(
+ MigrationRuleInputs migrationRuleInputs,
+ MigrationSettings migrationSettings,
+ out List warningMessages
+ )
{
- VerifyProject(migrationRuleInputs.ProjectContexts, migrationSettings.ProjectDirectory);
+ VerifyProject(migrationRuleInputs.ProjectContexts, migrationSettings.ProjectDirectory, out warningMessages);
}
- private void VerifyProject(IEnumerable projectContexts, string projectDirectory)
+ private void VerifyProject(
+ IEnumerable projectContexts,
+ string projectDirectory,
+ out List warningMessages)
{
+ warningMessages = null;
+
if (!projectContexts.Any())
{
MigrationErrorCodes.MIGRATE1013(String.Format(LocalizableStrings.MIGRATE1013Arg, projectDirectory)).Throw();
@@ -251,9 +263,29 @@ namespace Microsoft.DotNet.ProjectJsonMigration
var diagnostics = defaultProjectContext.ProjectFile.Diagnostics;
if (diagnostics.Any())
{
- MigrationErrorCodes.MIGRATE1011(
- String.Format("{0}{1}{2}", projectDirectory, Environment.NewLine, string.Join(Environment.NewLine, diagnostics.Select(d => FormatDiagnosticMessage(d)))))
- .Throw();
+ var warnings = diagnostics.Where(d => d.Severity == DiagnosticMessageSeverity.Warning);
+ if (warnings.Any())
+ {
+ var migrationError = MigrationErrorCodes.MIGRATE1011(String.Format(
+ "{0}{1}{2}",
+ projectDirectory,
+ Environment.NewLine,
+ string.Join(Environment.NewLine, diagnostics.Select(d => FormatDiagnosticMessage(d)))));
+
+ warningMessages = new List();
+ warningMessages.Add(migrationError.GetFormattedErrorMessage());
+ }
+
+ var errors = diagnostics.Where(d => d.Severity == DiagnosticMessageSeverity.Error);
+ if (errors.Any())
+ {
+ MigrationErrorCodes.MIGRATE1011(String.Format(
+ "{0}{1}{2}",
+ projectDirectory,
+ Environment.NewLine,
+ string.Join(Environment.NewLine, diagnostics.Select(d => FormatDiagnosticMessage(d)))))
+ .Throw();
+ }
}
var compilerName =
diff --git a/src/dotnet/commands/dotnet-migrate/MigrateCommand.cs b/src/dotnet/commands/dotnet-migrate/MigrateCommand.cs
index ea66ed320..131a9c3c2 100644
--- a/src/dotnet/commands/dotnet-migrate/MigrateCommand.cs
+++ b/src/dotnet/commands/dotnet-migrate/MigrateCommand.cs
@@ -279,6 +279,8 @@ namespace Microsoft.DotNet.Tools.Migrate
{
var errorContent = GetProjectReportErrorContent(projectMigrationReport, colored: true);
var successContent = GetProjectReportSuccessContent(projectMigrationReport, colored: true);
+ var warningContent = GetProjectReportWarningContent(projectMigrationReport, colored: true);
+ Reporter.Output.WriteLine(warningContent);
if (!string.IsNullOrEmpty(errorContent))
{
Reporter.Error.WriteLine(errorContent);
@@ -307,6 +309,8 @@ namespace Microsoft.DotNet.Tools.Migrate
{
var errorContent = GetProjectReportErrorContent(projectMigrationReport, colored: colored);
var successContent = GetProjectReportSuccessContent(projectMigrationReport, colored: colored);
+ var warningContent = GetProjectReportWarningContent(projectMigrationReport, colored: colored);
+ sb.AppendLine(warningContent);
if (!string.IsNullOrEmpty(errorContent))
{
sb.AppendLine(errorContent);
@@ -348,6 +352,19 @@ namespace Microsoft.DotNet.Tools.Migrate
projectMigrationReport.ProjectDirectory));
}
+ private string GetProjectReportWarningContent(ProjectMigrationReport projectMigrationReport, bool colored)
+ {
+ StringBuilder sb = new StringBuilder();
+ Func YellowIfColored = (str) => colored ? str.Yellow() : str;
+
+ foreach (var warning in projectMigrationReport.Warnings)
+ {
+ sb.AppendLine(YellowIfColored(warning));
+ }
+
+ return sb.ToString();
+ }
+
private string GetProjectReportErrorContent(ProjectMigrationReport projectMigrationReport, bool colored)
{
StringBuilder sb = new StringBuilder();
diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs
index d15de0265..e6ca62262 100644
--- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs
+++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/GivenAProjectMigrator.cs
@@ -6,6 +6,7 @@ using FluentAssertions;
using Microsoft.Build.Construction;
using Microsoft.DotNet.ProjectJsonMigration.Rules;
using Microsoft.DotNet.Internal.ProjectModel;
+using Microsoft.DotNet.TestFramework;
using Microsoft.DotNet.Tools.Common;
using Microsoft.DotNet.Tools.Test.Utilities;
using NuGet.Frameworks;
@@ -39,24 +40,54 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
[Fact]
- public void ItHasErrorWhenMigratingADeprecatedProjectJson()
+ public void ItHasWarningWhenMigratingADeprecatedProjectJson()
{
- var testProjectDirectory =
- TestAssetsManager.CreateTestInstance("TestLibraryWithDeprecatedProjectFile", callingMethod: "z")
- .Path;
+ var testProjectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project")
+ .FullName;
var mockProj = ProjectRootElement.Create();
- var testSettings = MigrationSettings.CreateMigrationSettingsTestHook(testProjectDirectory, testProjectDirectory, mockProj);
+ var testSettings = MigrationSettings.CreateMigrationSettingsTestHook(
+ testProjectDirectory,
+ testProjectDirectory,
+ mockProj);
var projectMigrator = new ProjectMigrator(new FakeEmptyMigrationRule());
var report = projectMigrator.Migrate(testSettings);
var projectReport = report.ProjectMigrationReports.First();
+ var warningMessage = projectReport.Warnings.First();
+ warningMessage.Should().Contain("MIGRATE1011::Deprecated Project:");
+ warningMessage.Should().Contain("The 'compile' option is deprecated. Use 'compile' in 'buildOptions' instead. (line: 3, file:");
+ }
+ [Fact]
+ public void ItHasErrorWhenMigratingADeprecatedNamedResourceOptionProjectJson()
+ {
+ var testProjectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedNamedResourceOption")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .FullName;
+
+ var mockProj = ProjectRootElement.Create();
+ var testSettings = MigrationSettings.CreateMigrationSettingsTestHook(
+ testProjectDirectory,
+ testProjectDirectory,
+ mockProj);
+
+ var projectMigrator = new ProjectMigrator(new FakeEmptyMigrationRule());
+ var report = projectMigrator.Migrate(testSettings);
+
+ var projectReport = report.ProjectMigrationReports.First();
var errorMessage = projectReport.Errors.First().GetFormattedErrorMessage();
errorMessage.Should().Contain("MIGRATE1011::Deprecated Project:");
- errorMessage.Should().Contain("The 'packInclude' option is deprecated. Use 'files' in 'packOptions' instead. (line: 6, file:");
- errorMessage.Should().Contain("The 'compilationOptions' option is deprecated. Use 'buildOptions' instead. (line: 3, file:");
+ errorMessage.Should().Contain("The 'namedResource' option is deprecated. Use 'embed' in 'buildOptions' instead. (line: 3, file:");
}
[Fact]
diff --git a/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs
new file mode 100644
index 000000000..c80911fc7
--- /dev/null
+++ b/test/dotnet-migrate.Tests/GivenThatIWantToMigrateDeprecatedProjects.cs
@@ -0,0 +1,546 @@
+// 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.
+
+using FluentAssertions;
+using Microsoft.DotNet.TestFramework;
+using Microsoft.DotNet.Tools.Test.Utilities;
+using System.IO;
+using System.IO.Compression;
+using System.Linq;
+using System.Xml.Linq;
+using Xunit;
+
+namespace Microsoft.DotNet.Migration.Tests
+{
+ public class GivenThatIWantToMigrateDeprecatedProjects : TestBase
+ {
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedPackOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedPackOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'repository' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'projectUrl' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'licenseUrl' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'iconUrl' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'owners' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'tags' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'releaseNotes' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'requireLicenseAcceptance' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'summary' option in the root is deprecated. Use it in 'packOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'packInclude' option is deprecated. Use 'files' in 'packOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedPackOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedPackOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("pack -c Debug")
+ .Should().Pass();
+
+ var outputDir = projectDirectory.GetDirectory("bin", "Debug");
+ outputDir.Should().Exist()
+ .And.HaveFile("PJAppWithDeprecatedPackOptions.1.0.0.nupkg");
+
+ var outputPackage = outputDir.GetFile("PJAppWithDeprecatedPackOptions.1.0.0.nupkg");
+
+ var zip = ZipFile.Open(outputPackage.FullName, ZipArchiveMode.Read);
+ zip.Entries.Should().Contain(e => e.FullName == "PJAppWithDeprecatedPackOptions.nuspec")
+ .And.Contain(e => e.FullName == "content/Content1.txt")
+ .And.Contain(e => e.FullName == "content/Content2.txt");
+
+ var manifestReader = new StreamReader(
+ zip.Entries.First(e => e.FullName == "PJAppWithDeprecatedPackOptions.nuspec").Open());
+
+ // NOTE: Commented out those that are not migrated.
+ // https://microsoft.sharepoint.com/teams/netfx/corefx/_layouts/15/WopiFrame.aspx?sourcedoc=%7B0cfbc196-0645-4781-84c6-5dffabd76bee%7D&action=edit&wd=target%28Planning%2FMSBuild%20CLI%20integration%2Eone%7C41D470DD-CF44-4595-8E05-0CE238864B55%2FProject%2Ejson%20Migration%7CA553D979-EBC6-484B-A12E-036E0730864A%2F%29
+ var nuspecXml = XDocument.Parse(manifestReader.ReadToEnd());
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "projectUrl").Value
+ .Should().Be("http://projecturl/");
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "licenseUrl").Value
+ .Should().Be("http://licenseurl/");
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "iconUrl").Value
+ .Should().Be("http://iconurl/");
+ //nuspecXml.Descendants().Single(e => e.Name.LocalName == "owners").Value
+ // .Should().Be("owner1,owner2");
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "tags").Value
+ .Should().Be("tag1 tag2");
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "releaseNotes").Value
+ .Should().Be("releaseNotes");
+ nuspecXml.Descendants().Single(e => e.Name.LocalName == "requireLicenseAcceptance").Value
+ .Should().Be("true");
+ //nuspecXml.Descendants().Single(e => e.Name.LocalName == "summary").Value
+ // .Should().Be("summary");
+
+ var repositoryNode = nuspecXml.Descendants().Single(e => e.Name.LocalName == "repository");
+ repositoryNode.Attributes("type").Single().Value.Should().Be("git");
+ repositoryNode.Attributes("url").Single().Value.Should().Be("http://url/");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompilationOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompilationOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'compilerName' option in the root is deprecated. Use it in 'buildOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'compilationOptions' option is deprecated. Use 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompilationOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompilationOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedContentOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedContentOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'content' option is deprecated. Use 'publishOptions' to publish or 'copyToOutput' in 'buildOptions' to copy to build output instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'contentExclude' option is deprecated. Use 'publishOptions' to publish or 'copyToOutput' in 'buildOptions' to copy to build output instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'contentFiles' option is deprecated. Use 'publishOptions' to publish or 'copyToOutput' in 'buildOptions' to copy to build output instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'contentBuiltIn' option is deprecated. Use 'publishOptions' to publish or 'copyToOutput' in 'buildOptions' to copy to build output instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedContentOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedContentOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("publish -c Debug")
+ .Should().Pass();
+
+ var outputDir = projectDirectory.GetDirectory("bin", "Debug", "netcoreapp1.0");
+ outputDir.Should().Exist()
+ .And.HaveFiles(new[]
+ {
+ "ContentFile1.txt",
+ "ContentFile2.txt",
+ "ContentFileBuiltIn1.txt",
+ "ContentFileBuiltIn2.txt",
+ "IncludeThis.txt",
+ });
+ Directory.Exists(Path.Combine(outputDir.FullName, "ExcludeThis1.txt")).Should().BeFalse();
+ Directory.Exists(Path.Combine(outputDir.FullName, "ExcludeThis2.txt")).Should().BeFalse();
+
+ var publishDir = projectDirectory.GetDirectory("bin", "Debug", "netcoreapp1.0", "publish");
+ publishDir.Should().Exist()
+ .And.HaveFiles(new[]
+ {
+ "ContentFile1.txt",
+ "ContentFile2.txt",
+ "ContentFileBuiltIn1.txt",
+ "ContentFileBuiltIn2.txt",
+ "IncludeThis.txt",
+ });
+ Directory.Exists(Path.Combine(publishDir.FullName, "ExcludeThis1.txt")).Should().BeFalse();
+ Directory.Exists(Path.Combine(publishDir.FullName, "ExcludeThis2.txt")).Should().BeFalse();
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'compile' option is deprecated. Use 'compile' in 'buildOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'compileFiles' option is deprecated. Use 'compile' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileBuiltInOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileBuiltInOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'compileBuiltIn' option is deprecated. Use 'compile' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileBuiltInOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileBuiltInOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ //Issue: https://github.com/dotnet/cli/issues/5467
+ //new DotnetCommand()
+ // .WithWorkingDirectory(projectDirectory)
+ // .Execute("build -c Debug")
+ // .Should().Pass();
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileExcludeOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileExcludeOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'compileExclude' option is deprecated. Use 'compile' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedCompileExcludeOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedCompileExcludeOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ // Issue: https://github.com/dotnet/cli/issues/5461
+ //new DotnetCommand()
+ // .WithWorkingDirectory(projectDirectory)
+ // .Execute("build -c Debug")
+ // .Should().Pass();
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedResourceOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'resource' option is deprecated. Use 'embed' in 'buildOptions' instead.");
+ cmd.StdOut.Should().Contain(
+ "The 'resourceFiles' option is deprecated. Use 'embed' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedResourceOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("run -c Debug");
+ cmd.Should().Pass();
+ cmd.StdOut.Should().Contain("3 Resources Found:");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedResourceBuiltInOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceBuiltInOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'resourceBuiltIn' option is deprecated. Use 'embed' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingDeprecatedBuiltInResItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceBuiltInOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root
+ .GetDirectory("project");
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("build -c Debug")
+ .Should().Pass();
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("run -c Debug");
+ cmd.Should().Pass();
+ // Issue: https://github.com/dotnet/cli/issues/5467
+ //cmd.StdOut.Should().Contain("2 Resources Found:");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedResourceExcludeOptionsWarningsArePrinted()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceExcludeOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ var cmd = new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .ExecuteWithCapturedOutput("migrate");
+
+ cmd.Should().Pass();
+
+ cmd.StdOut.Should().Contain(
+ "The 'resourceExclude' option is deprecated. Use 'embed' in 'buildOptions' instead.");
+ }
+
+ [Fact]
+ public void WhenMigratingAProjectWithDeprecatedResourceExcludeOptionsItSucceeds()
+ {
+ var projectDirectory = TestAssets
+ .GetProjectJson(TestAssetKinds.NonRestoredTestProjects, "PJAppWithDeprecatedResourceExcludeOptions")
+ .CreateInstance()
+ .WithSourceFiles()
+ .Root;
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("migrate")
+ .Should().Pass();
+
+ new DotnetCommand()
+ .WithWorkingDirectory(projectDirectory)
+ .Execute("restore")
+ .Should().Pass();
+
+ // Issue: https://github.com/dotnet/cli/issues/5461
+ //new DotnetCommand()
+ // .WithWorkingDirectory(projectDirectory)
+ // .Execute("build -c Debug")
+ // .Should().Pass();
+
+ //var cmd = new DotnetCommand()
+ // .WithWorkingDirectory(projectDirectory)
+ // .ExecuteWithCapturedOutput("run -c Debug");
+ //cmd.Should().Pass();
+ //cmd.StdOut.Should().Contain("0 Resources Found:");
+ }
+ }
+}