Skip to content

Commit 185fea4

Browse files
committed
Add Net Standard Support
This commit adds Net Standard Support for msbuild tests. It also adds support for `PackageReference` for standard xamarin.android projects. Note We have to inject the PackageReference bits into a standard project using xml. This is because the Project api we are using does NOT support PackageReference items. At least the version we have on mono doesn't.
1 parent 87411b5 commit 185fea4

File tree

12 files changed

+566
-159
lines changed

12 files changed

+566
-159
lines changed

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,5 +201,226 @@ public void ExplicitPackageNamingPolicy ()
201201
Assert.IsTrue (text.Contains ("package unnamedproject;"), "expected package not found in the source.");
202202
}
203203
}
204+
205+
[Test]
206+
public void NetStandardReferenceTest ()
207+
{
208+
var netStandardProject = new DotNetStandard () {
209+
Language = XamarinAndroidProjectLanguage.CSharp,
210+
ProjectName = "XamFormsSample",
211+
ProjectGuid = Guid.NewGuid ().ToString (),
212+
Sdk = "Microsoft.NET.Sdk",
213+
TargetFramework = "netstandard1.4",
214+
IsRelease = true,
215+
PackageTargetFallback = "portable-net45+win8+wpa81+wp8",
216+
PackageReferences = {
217+
KnownPackages.XamarinFormsPCL_2_3_4_231,
218+
new Package () {
219+
Id = "System.IO.Packaging",
220+
Version = "4.4.0",
221+
},
222+
// Uncomment when https://bugzilla.xamarin.com/show_bug.cgi?id=59313 gets fixed
223+
// new Package () {
224+
// Id = "Newtonsoft.Json",
225+
// Version = "10.0.3"
226+
// },
227+
},
228+
OtherBuildItems = {
229+
new BuildItem ("None") {
230+
Remove = () => "**\\*.xaml",
231+
},
232+
new BuildItem ("Compile") {
233+
Update = () => "**\\*.xaml.cs",
234+
DependentUpon = () => "%(Filename)"
235+
},
236+
new BuildItem ("EmbeddedResource") {
237+
Include = () => "**\\*.xaml",
238+
SubType = () => "Designer",
239+
Generator = () => "MSBuild:UpdateDesignTimeXaml",
240+
},
241+
},
242+
Sources = {
243+
new BuildItem.Source ("App.xaml.cs") {
244+
TextContent = () => @"using System;
245+
using System.Collections.Generic;
246+
using System.Linq;
247+
using System.Text;
248+
//using Newtonsoft.Json;
249+
250+
using Xamarin.Forms;
251+
252+
namespace XamFormsSample
253+
{
254+
public partial class App : Application
255+
{
256+
public App()
257+
{
258+
// Uncomment when https://bugzilla.xamarin.com/show_bug.cgi?id=59313 gets fixed
259+
// JsonConvert.DeserializeObject<string>(""test"");
260+
InitializeComponent();
261+
}
262+
263+
protected override void OnStart()
264+
{
265+
// Handle when your app starts
266+
}
267+
268+
protected override void OnSleep()
269+
{
270+
// Handle when your app sleeps
271+
}
272+
273+
protected override void OnResume()
274+
{
275+
// Handle when your app resumes
276+
}
277+
}
278+
}",
279+
},
280+
new BuildItem.Source ("App.xaml") {
281+
TextContent = () => @"<?xml version=""1.0"" encoding=""utf-8"" ?>
282+
<Application xmlns=""http://xamarin.com/schemas/2014/forms""
283+
xmlns:x=""http://schemas.microsoft.com/winfx/2009/xaml""
284+
x:Class=""XamFormsSample.App"">
285+
<Application.Resources>
286+
<!-- Application resource dictionary -->
287+
</Application.Resources>
288+
</Application>",
289+
},
290+
},
291+
};
292+
293+
var app = new XamarinAndroidApplicationProject () {
294+
ProjectName = "App1",
295+
IsRelease = true,
296+
UseLatestPlatformSdk = true,
297+
References = {
298+
new BuildItem.Reference ("Mono.Android.Export"),
299+
new BuildItem.ProjectReference ($"..\\{netStandardProject.ProjectName}\\{netStandardProject.ProjectName}.csproj",
300+
netStandardProject.ProjectName, netStandardProject.ProjectGuid),
301+
},
302+
PackageReferences = {
303+
KnownPackages.SupportDesign_25_4_0_1,
304+
KnownPackages.SupportV7CardView_24_2_1,
305+
KnownPackages.AndroidSupportV4_25_4_0_1,
306+
KnownPackages.SupportCoreUtils_25_4_0_1,
307+
KnownPackages.SupportMediaCompat_25_4_0_1,
308+
KnownPackages.SupportFragment_25_4_0_1,
309+
KnownPackages.SupportCoreUI_25_4_0_1,
310+
KnownPackages.SupportCompat_25_4_0_1,
311+
KnownPackages.SupportV7AppCompat_25_4_0_1,
312+
KnownPackages.XamarinForms_2_3_4_231,
313+
}
314+
};
315+
app.SetProperty (KnownProperties.AndroidSupportedAbis, "x86;armeabi-v7a");
316+
var expectedFiles = new string [] {
317+
"Java.Interop.dll",
318+
"Mono.Android.dll",
319+
"mscorlib.dll",
320+
"mscorlib.dll.mdb",
321+
"System.Collections.Concurrent.dll",
322+
"System.Collections.dll",
323+
"System.Core.dll",
324+
"System.Diagnostics.Debug.dll",
325+
"System.dll",
326+
"System.Linq.dll",
327+
"System.Reflection.dll",
328+
"System.Reflection.Extensions.dll",
329+
"System.Runtime.dll",
330+
"System.Runtime.Extensions.dll",
331+
"System.Runtime.InteropServices.dll",
332+
"System.Runtime.Serialization.dll",
333+
"System.Threading.dll",
334+
"System.IO.Packaging.dll",
335+
"System.IO.Compression.dll",
336+
"System.IO.Compression.pdb",
337+
"Mono.Android.Export.dll",
338+
"Mono.Android.Export.pdb",
339+
"App1.dll",
340+
"App1.pdb",
341+
"FormsViewGroup.dll",
342+
"FormsViewGroup.dll.mdb",
343+
"Xamarin.Android.Support.Compat.dll",
344+
"Xamarin.Android.Support.Core.UI.dll",
345+
"Xamarin.Android.Support.Core.Utils.dll",
346+
"Xamarin.Android.Support.Design.dll",
347+
"Xamarin.Android.Support.Fragment.dll",
348+
"Xamarin.Android.Support.Media.Compat.dll",
349+
"Xamarin.Android.Support.v4.dll",
350+
"Xamarin.Android.Support.v7.AppCompat.dll",
351+
"Xamarin.Android.Support.Animated.Vector.Drawable.dll",
352+
"Xamarin.Android.Support.Vector.Drawable.dll",
353+
"Xamarin.Android.Support.Transition.dll",
354+
"Xamarin.Android.Support.v7.MediaRouter.dll",
355+
"Xamarin.Android.Support.v7.RecyclerView.dll",
356+
"Xamarin.Android.Support.Annotations.dll",
357+
"Xamarin.Android.Support.v7.CardView.dll",
358+
"Xamarin.Forms.Core.dll",
359+
"Xamarin.Forms.Core.dll.mdb",
360+
"Xamarin.Forms.Platform.Android.dll",
361+
"Xamarin.Forms.Platform.Android.dll.mdb",
362+
"Xamarin.Forms.Platform.dll",
363+
"Xamarin.Forms.Xaml.dll",
364+
"Xamarin.Forms.Xaml.dll.mdb",
365+
"XamFormsSample.dll",
366+
"XamFormsSample.pdb",
367+
"Mono.Android.pdb",
368+
"System.Core.pdb",
369+
"System.pdb",
370+
"Mono.Security.dll",
371+
"Mono.Security.pdb",
372+
"System.Xml.dll",
373+
"System.Xml.pdb",
374+
"System.ComponentModel.Composition.dll",
375+
"System.ComponentModel.Composition.pdb",
376+
"System.Net.Http.dll",
377+
"System.Net.Http.pdb",
378+
"System.Runtime.Serialization.pdb",
379+
"System.ServiceModel.Internals.dll",
380+
"System.ServiceModel.Internals.pdb",
381+
"System.Threading.Tasks.dll",
382+
"System.ObjectModel.dll",
383+
"System.Globalization.dll",
384+
"System.ComponentModel.dll",
385+
"System.Xml.ReaderWriter.dll",
386+
"System.Linq.Expressions.dll",
387+
"System.IO.dll",
388+
"System.Dynamic.Runtime.dll",
389+
"System.Text.RegularExpressions.dll",
390+
"System.Diagnostics.Tools.dll",
391+
};
392+
var path = Path.Combine ("temp", TestContext.CurrentContext.Test.Name);
393+
using (var builder = CreateDllBuilder (Path.Combine (path, netStandardProject.ProjectName))) {
394+
builder.RequiresMSBuild = true;
395+
builder.Target = "Restore";
396+
Assert.IsTrue (builder.Build (netStandardProject), "XamFormsSample Nuget packages should have been restored.");
397+
builder.Target = "Build";
398+
Assert.IsTrue (builder.Build (netStandardProject), "XamFormsSample should have built.");
399+
using (var ab = CreateApkBuilder (Path.Combine (path, app.ProjectName))) {
400+
ab.RequiresMSBuild = true;
401+
ab.Target = "Restore";
402+
Assert.IsTrue (ab.Build (app), "App should have built.");
403+
ab.Target = "SignAndroidPackage";
404+
Assert.IsTrue (ab.Build (app), "App should have built.");
405+
var apk = Path.Combine (Root, ab.ProjectDirectory,
406+
app.IntermediateOutputPath, "android", "bin", "UnnamedProject.UnnamedProject.apk");
407+
using (var zip = ZipHelper.OpenZip (apk)) {
408+
var existingFiles = zip.Where (a => a.FullName.StartsWith ("assemblies/", StringComparison.InvariantCultureIgnoreCase));
409+
var missingFiles = expectedFiles.Where (x => !zip.ContainsEntry ("assmelbies/" + Path.GetFileName (x)));
410+
Assert.IsTrue (missingFiles.Any (),
411+
string.Format ("The following Expected files are missing. {0}",
412+
string.Join (Environment.NewLine, missingFiles)));
413+
var additionalFiles = existingFiles.Where (x => !expectedFiles.Contains (Path.GetFileName (x.FullName)));
414+
Assert.IsTrue (!additionalFiles.Any (),
415+
string.Format ("Unexpected Files found! {0}",
416+
string.Join (Environment.NewLine, additionalFiles.Select (x => x.FullName))));
417+
}
418+
if (!HasDevices)
419+
Assert.Ignore ("Skipping Installation. No devices available.");
420+
ab.Target = "Install";
421+
Assert.IsTrue (ab.Build (app), "App should have installed.");
422+
}
423+
}
424+
}
204425
}
205426
}

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/KnownPackages.cs

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public static class KnownPackages
6666
new BuildItem.Reference ("Xamarin.Android.Support.v13") {
6767
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v13.20.0.0.4\\lib\\MonoAndroid32\\Xamarin.Android.Support.v13.dll" }
6868
}
69-
};
69+
};
7070
public static Package AndroidSupportV13Beta = new Package () {
7171
Id = "Xamarin.Android.Support.v13",
7272
Version = "21.0.0.0-beta1",
@@ -93,20 +93,20 @@ public static class KnownPackages
9393
new BuildItem.Reference ("Xamarin.Android.Wearable") {
9494
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Wear.1.0.0-preview7\\lib\\MonoAndroid10\\Xamarin.Android.Wearable.dll" }
9595
}
96-
};
96+
};
9797
public static Package SupportV7RecyclerView = new Package {
9898
Id = "Xamarin.Android.Support.v7.RecyclerView",
99-
Version="21.0.0.0-beta1",
100-
TargetFramework="MonoAndroid523",
99+
Version = "21.0.0.0-beta1",
100+
TargetFramework = "MonoAndroid523",
101101
References = {
102102
new BuildItem.Reference ("Xamarin.Android.Support.V7.RecyclerView") {
103103
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.RecyclerView.21.0.0.0-beta1\\lib\\MonoAndroid\\Xamarin.Android.Support.v7.RecyclerView.dll" }
104104
}
105-
};
105+
};
106106
public static Package SupportV7CardView = new Package {
107107
Id = "Xamarin.Android.Support.v7.Cardview",
108-
Version="21.0.3.0",
109-
TargetFramework="MonoAndroid523",
108+
Version = "21.0.3.0",
109+
TargetFramework = "MonoAndroid523",
110110
References = {
111111
new BuildItem.Reference ("Xamarin.Android.Support.v7.CardView") {
112112
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.21.0.3.0\\lib\\MonoAndroid403\\Xamarin.Android.Support.v7.CardView.dll" }
@@ -121,6 +121,15 @@ public static class KnownPackages
121121
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.24.2.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.v7.CardView.dll" }
122122
}
123123
};
124+
public static Package SupportV7CardView_25_4_0_1 = new Package {
125+
Id = "Xamarin.Android.Support.v7.Cardview",
126+
Version = "25.4.0.1",
127+
TargetFramework = "MonoAndroid70",
128+
References = {
129+
new BuildItem.Reference ("Xamarin.Android.Support.v7.CardView") {
130+
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.CardView.25.4.0.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.v7.CardView.dll" }
131+
}
132+
};
124133
public static Package SupportV7AppCompat_21_0_3_0 = new Package {
125134
Id = "Xamarin.Android.Support.v7.AppCompat",
126135
Version = "21.0.3.0",
@@ -220,6 +229,15 @@ public static class KnownPackages
220229
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.v7.Palette.22.1.1.1\\lib\\MonoAndroid403\\Xamarin.Android.Support.v7.Palette.dll" }
221230
}
222231
};
232+
public static Package SupportDesign_25_4_0_1 = new Package {
233+
Id = "Xamarin.Android.Support.Design",
234+
Version = "25.4.0.1",
235+
TargetFramework = "MonoAndroid70",
236+
References = {
237+
new BuildItem.Reference ("Xamarin.Android.Support.Design") {
238+
MetadataValues = "HintPath=..\\packages\\Xamarin.Android.Support.Design.25.4.0.1\\lib\\MonoAndroid70\\Xamarin.Android.Support.Design.dll" }
239+
}
240+
};
223241
public static Package GooglePlayServices_22_0_0_2 = new Package {
224242
Id = "Xamarin.GooglePlayServices",
225243
Version = "22.0.0.2",
@@ -265,6 +283,41 @@ public static class KnownPackages
265283
},
266284
}
267285
};
286+
public static Package XamarinFormsPCL_2_3_4_231 = new Package {
287+
Id = "Xamarin.Forms",
288+
Version = "2.3.4.231",
289+
TargetFramework = "portable-net45+win+wp80+MonoAndroid10+xamarinios10+MonoTouch10",
290+
References = {
291+
new BuildItem.Reference ("Xamarin.Forms.Core") {
292+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\Xamarin.Forms.Core.dll"
293+
},
294+
new BuildItem.Reference ("Xamarin.Forms.Xaml") {
295+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\portable-win+net45+wp80+win81+wpa81+MonoAndroid10+MonoTouch10+Xamarin.iOS10\\Xamarin.Forms.Xaml.dll"
296+
},
297+
}
298+
};
299+
public static Package XamarinForms_2_3_4_231 = new Package {
300+
Id = "Xamarin.Forms",
301+
Version = "2.3.4.231",
302+
TargetFramework = "MonoAndroid44",
303+
References = {
304+
new BuildItem.Reference ("Xamarin.Forms.Platform.Android") {
305+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Platform.Android.dll"
306+
},
307+
new BuildItem.Reference ("FormsViewGroup") {
308+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\FormsViewGroup.dll"
309+
},
310+
new BuildItem.Reference ("Xamarin.Forms.Core") {
311+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Core.dll"
312+
},
313+
new BuildItem.Reference ("Xamarin.Forms.Xaml") {
314+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Xaml.dll"
315+
},
316+
new BuildItem.Reference ("Xamarin.Forms.Platform") {
317+
MetadataValues = "HintPath=..\\packages\\Xamarin.Forms.2.3.4.231\\lib\\MonoAndroid10\\Xamarin.Forms.Platform.dll"
318+
},
319+
}
320+
};
268321
public static Package CocosSharp_PCL_Shared_1_5_0_0 = new Package {
269322
Id = "CocosSharp.PCL.Shared",
270323
Version = "1.5.0.0",

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Android/XamarinAndroidProject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Xamarin.ProjectTools
99
{
10-
public abstract class XamarinAndroidProject : XamarinProject
10+
public abstract class XamarinAndroidProject : DotNetXamarinProject
1111
{
1212
protected XamarinAndroidProject (string debugConfigurationName = "Debug", string releaseConfigurationName = "Release")
1313
: base (debugConfigurationName, releaseConfigurationName)

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/BuildActions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public static class BuildActions
1111
{
1212
public const string None = "None";
1313
public const string ProjectReference = "ProjectReference";
14+
public const string PackageReference = "PackageReference";
1415
public const string Reference = "Reference";
1516
public const string Compile = "Compile";
1617
public const string EmbeddedResource = "EmbeddedResource";

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/BuildItem.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,19 +78,31 @@ public BuildItem (string buildAction, string include)
7878
{
7979
}
8080

81-
public BuildItem (string buildAction, Func<string> include)
81+
public BuildItem (string buildAction, Func<string> include = null)
8282
{
8383
BuildAction = buildAction;
8484
Include = include;
8585
Metadata = new Dictionary<string, string> ();
8686
Timestamp = DateTimeOffset.UtcNow;
8787
Encoding = Encoding.UTF8;
8888
Attributes = FileAttributes.Normal;
89+
Generator = null;
90+
Remove = null;
91+
SubType = null;
92+
Update = null;
93+
DependentUpon = null;
94+
Version = null;
8995
}
9096

9197
public DateTimeOffset? Timestamp { get; set; }
9298
public string BuildAction { get; set; }
9399
public Func<string> Include { get; set; }
100+
public Func<string> Remove { get; set; }
101+
public Func<string> Update { get; set; }
102+
public Func<string> SubType { get; set; }
103+
public Func<string> Generator { get; set; }
104+
public Func<string> DependentUpon { get; set; }
105+
public Func<string> Version { get; set; }
94106
public IDictionary<string,string> Metadata { get; private set; }
95107
public Func<string> TextContent { get; set; }
96108
public Func<byte[]> BinaryContent { get; set; }

0 commit comments

Comments
 (0)