[dotnet] Implement resource bundling. (#9472)
* Port the BundledResources test to .NET. * Fix a minor issue in the BundledResources test to make sure it works on macOS. * Add a unit test to make sure resources are bundled as expected. * Modify the .NET build logic to bundle/unbundle resources.
This commit is contained in:
Родитель
18ca278e88
Коммит
ab47edcb27
|
@ -90,6 +90,9 @@
|
||||||
<!-- Inject our custom logic into *DependsOn variables -->
|
<!-- Inject our custom logic into *DependsOn variables -->
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<BuildDependsOn>
|
<BuildDependsOn>
|
||||||
|
_CollectBundleResources;
|
||||||
|
_PackLibraryResources;
|
||||||
|
_UnpackLibraryResources;
|
||||||
$(BuildDependsOn);
|
$(BuildDependsOn);
|
||||||
_CreateAppBundle;
|
_CreateAppBundle;
|
||||||
Codesign;
|
Codesign;
|
||||||
|
@ -98,7 +101,6 @@
|
||||||
<!-- We re-use ComputeFilesToPublish & CopyFilesToPublishDirectory to copy files to the .app -->
|
<!-- We re-use ComputeFilesToPublish & CopyFilesToPublishDirectory to copy files to the .app -->
|
||||||
<!-- ComputeFilesToPublish will run ILLink -->
|
<!-- ComputeFilesToPublish will run ILLink -->
|
||||||
<CreateAppBundleDependsOn>
|
<CreateAppBundleDependsOn>
|
||||||
_CollectBundleResources;
|
|
||||||
_DetectAppManifest;
|
_DetectAppManifest;
|
||||||
_CopyResourcesToBundle;
|
_CopyResourcesToBundle;
|
||||||
_CompileAppManifest;
|
_CompileAppManifest;
|
||||||
|
|
|
@ -32,7 +32,12 @@ namespace BundledResources {
|
||||||
// resources are removed by the linker or an extra step (e.g. "link sdk" or "don't link") but that
|
// resources are removed by the linker or an extra step (e.g. "link sdk" or "don't link") but that
|
||||||
// extra step is done only on device (to keep the simulator builds as fast as possible)
|
// extra step is done only on device (to keep the simulator builds as fast as possible)
|
||||||
var resources = typeof(ResourcesTest).Assembly.GetManifestResourceNames ();
|
var resources = typeof(ResourcesTest).Assembly.GetManifestResourceNames ();
|
||||||
if (Runtime.Arch == Arch.DEVICE) {
|
#if __MACOS__
|
||||||
|
var hasResources = false;
|
||||||
|
#else
|
||||||
|
var hasResources = Runtime.Arch != Arch.DEVICE;
|
||||||
|
#endif
|
||||||
|
if (!hasResources) {
|
||||||
Assert.That (resources.Length, Is.EqualTo (0), "No resources");
|
Assert.That (resources.Length, Is.EqualTo (0), "No resources");
|
||||||
} else {
|
} else {
|
||||||
Assert.That (resources.Length, Is.GreaterThanOrEqualTo (2), "Resources");
|
Assert.That (resources.Length, Is.GreaterThanOrEqualTo (2), "Resources");
|
||||||
|
@ -41,4 +46,4 @@ namespace BundledResources {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project Sdk="Microsoft.iOS.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NUnitLite" Version="3.12.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\basn3p08.png">
|
||||||
|
<Link>basn3p08.png</Link>
|
||||||
|
</BundleResource>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\xamvideotest.mp4">
|
||||||
|
<Link>xamvideotest.mp4</Link>
|
||||||
|
</BundleResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\ResourcesTest.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project Sdk="Microsoft.macOS.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NUnitLite" Version="3.12.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\basn3p08.png">
|
||||||
|
<Link>basn3p08.png</Link>
|
||||||
|
</BundleResource>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\xamvideotest.mp4">
|
||||||
|
<Link>xamvideotest.mp4</Link>
|
||||||
|
</BundleResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\ResourcesTest.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project Sdk="Microsoft.tvOS.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NUnitLite" Version="3.12.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\basn3p08.png">
|
||||||
|
<Link>basn3p08.png</Link>
|
||||||
|
</BundleResource>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\xamvideotest.mp4">
|
||||||
|
<Link>xamvideotest.mp4</Link>
|
||||||
|
</BundleResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\ResourcesTest.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project Sdk="Microsoft.watchOS.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="NUnitLite" Version="3.12.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\basn3p08.png">
|
||||||
|
<Link>basn3p08.png</Link>
|
||||||
|
</BundleResource>
|
||||||
|
<BundleResource Include="..\..\..\monotouch-test\xamvideotest.mp4">
|
||||||
|
<Link>xamvideotest.mp4</Link>
|
||||||
|
</BundleResource>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\ResourcesTest.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -211,6 +211,38 @@ namespace Xamarin.Tests {
|
||||||
Assert.That (ad.MainModule.Resources [0].Name, Is.EqualTo ("libtest2.a"), "libtest2.a");
|
Assert.That (ad.MainModule.Resources [0].Name, Is.EqualTo ("libtest2.a"), "libtest2.a");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase ("iOS", "monotouch")]
|
||||||
|
[TestCase ("tvOS", "monotouch")]
|
||||||
|
[TestCase ("watchOS", "monotouch")]
|
||||||
|
[TestCase ("macOS", "xammac")]
|
||||||
|
public void BuildBundledResources (string platform, string prefix)
|
||||||
|
{
|
||||||
|
var assemblyName = "BundledResources";
|
||||||
|
var dotnet_bindings_dir = Path.Combine (Configuration.SourceRoot, "tests", assemblyName, "dotnet");
|
||||||
|
var project_dir = Path.Combine (dotnet_bindings_dir, platform);
|
||||||
|
var project_path = Path.Combine (project_dir, $"{assemblyName}.csproj");
|
||||||
|
|
||||||
|
Clean (project_path);
|
||||||
|
CopyDotNetSupportingFiles (dotnet_bindings_dir);
|
||||||
|
var result = DotNet.AssertBuild (project_path, verbosity);
|
||||||
|
var lines = result.StandardOutput.ToString ().Split ('\n');
|
||||||
|
// Find the resulting binding assembly from the build log
|
||||||
|
var assemblies = FilterToAssembly (lines, assemblyName);
|
||||||
|
Assert.That (assemblies, Is.Not.Empty, "Assemblies");
|
||||||
|
// Make sure there's no other assembly confusing our logic
|
||||||
|
Assert.That (assemblies.Distinct ().Count (), Is.EqualTo (1), "Unique assemblies");
|
||||||
|
var asm = assemblies.First ();
|
||||||
|
Assert.That (asm, Does.Exist, "Assembly existence");
|
||||||
|
|
||||||
|
// Verify that there's one resource in the binding assembly, and its name
|
||||||
|
var ad = AssemblyDefinition.ReadAssembly (asm, new ReaderParameters { ReadingMode = ReadingMode.Deferred });
|
||||||
|
Assert.That (ad.MainModule.Resources.Count, Is.EqualTo (2), "2 resources");
|
||||||
|
// Sort the resources before we assert, since we don't care about the order, and sorted order makes the asserts simpler.
|
||||||
|
var resources = ad.MainModule.Resources.OrderBy (v => v.Name).ToArray ();
|
||||||
|
Assert.That (resources [0].Name, Is.EqualTo ($"__{prefix}_content_basn3p08.png"), $"__{prefix}_content_basn3p08.png");
|
||||||
|
Assert.That (resources [1].Name, Is.EqualTo ($"__{prefix}_content_xamvideotest.mp4"), $"__{prefix}_content_xamvideotest.mp4");
|
||||||
|
}
|
||||||
|
|
||||||
[TestCase ("iOS")]
|
[TestCase ("iOS")]
|
||||||
[TestCase ("tvOS")]
|
[TestCase ("tvOS")]
|
||||||
// [TestCase ("watchOS")] // No watchOS Touch.Client project for .NET yet
|
// [TestCase ("watchOS")] // No watchOS Touch.Client project for .NET yet
|
||||||
|
|
Загрузка…
Ссылка в новой задаче