diff --git a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets index a79e8081604..51a009bd776 100644 --- a/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets +++ b/src/Xamarin.Android.Build.Tasks/Microsoft.Android.Sdk/targets/Microsoft.Android.Sdk.AssemblyResolution.targets @@ -44,7 +44,7 @@ _ResolveAssemblies MSBuild target. @@ -90,6 +90,7 @@ _ResolveAssemblies MSBuild target. <_AdditionalProperties> _ComputeFilesToPublishForRuntimeIdentifiers=true ;AppendRuntimeIdentifierToOutputPath=true + ;ResolveAssemblyReferencesFindRelatedSatellites=false ;SkipCompilerExecution=true ;_OuterIntermediateAssembly=@(IntermediateAssembly) ;_OuterOutputPath=$(OutputPath) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index 1eb4ac86768..f5abcd52b69 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -1108,6 +1108,82 @@ public void DotNetIncremental ([Values (true, false)] bool isRelease, [Values (" } } + [Test] + public void ProjectDependencies ([Values(true, false)] bool projectReference) + { + // Setup dependencies App A -> Lib B -> Lib C + var path = Path.Combine ("temp", TestName); + + var libB = new XASdkProject (outputType: "Library") { + ProjectName = "LibraryB", + IsRelease = true, + }; + libB.Sources.Clear (); + libB.Sources.Add (new BuildItem.Source ("Foo.cs") { + TextContent = () => @"public class Foo { + public Foo () { + var bar = new Bar(); + } + }", + }); + + var libC = new XASdkProject (outputType: "Library") { + ProjectName = "LibraryC", + IsRelease = true, + }; + libC.Sources.Clear (); + libC.Sources.Add (new BuildItem.Source ("Bar.cs") { + TextContent = () => "public class Bar { }", + }); + libC.Sources.Add (new BuildItem ("EmbeddedResource", "Foo.resx") { + TextContent = () => InlineData.ResxWithContents ("Cancel") + }); + libC.Sources.Add (new BuildItem ("EmbeddedResource", "Foo.es.resx") { + TextContent = () => InlineData.ResxWithContents ("Cancelar") + }); + + // Add a @(Reference) or @(ProjectReference) + if (projectReference) { + libB.AddReference (libC); + } else { + libB.OtherBuildItems.Add (new BuildItem.Reference ($@"..\{libC.ProjectName}\bin\Release\{libC.TargetFramework}\{libC.ProjectName}.dll")); + } + + // Build libraries + var libCBuilder = CreateDotNetBuilder (libC, Path.Combine (path, libC.ProjectName)); + Assert.IsTrue (libCBuilder.Build (), $"{libC.ProjectName} should succeed"); + var libBBuilder = CreateDotNetBuilder (libB, Path.Combine (path, libB.ProjectName)); + Assert.IsTrue (libBBuilder.Build (), $"{libB.ProjectName} should succeed"); + + var appA = new XASdkProject { + ProjectName = "AppA", + IsRelease = true, + Sources = { + new BuildItem.Source ("Bar.cs") { + TextContent = () => "public class Bar : Foo { }", + }, + new BuildItem ("EmbeddedResource", "Foo.resx") { + TextContent = () => InlineData.ResxWithContents ("Cancel") + }, + new BuildItem ("EmbeddedResource", "Foo.es.resx") { + TextContent = () => InlineData.ResxWithContents ("Cancelar") + }, + } + }; + appA.AddReference (libB); + var appBuilder = CreateDotNetBuilder (appA, Path.Combine (path, appA.ProjectName)); + Assert.IsTrue (appBuilder.Build (), $"{appA.ProjectName} should succeed"); + + var apkPath = Path.Combine (FullProjectDirectory, appA.OutputPath, $"{appA.PackageName}-Signed.apk"); + FileAssert.Exists (apkPath); + var helper = new ArchiveAssemblyHelper (apkPath); + helper.AssertContainsEntry ($"assemblies/{appA.ProjectName}.dll"); + helper.AssertContainsEntry ($"assemblies/{libB.ProjectName}.dll"); + helper.AssertContainsEntry ($"assemblies/{libC.ProjectName}.dll"); + helper.AssertContainsEntry ($"assemblies/es/{appA.ProjectName}.resources.dll"); + helper.AssertContainsEntry ($"assemblies/es/{libC.ProjectName}.resources.dll"); + } + [Test] public void DotNetDesignTimeBuild () {