108 строки
2.9 KiB
C#
108 строки
2.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Collections.Generic;
|
|
|
|
using Microsoft.Build.Framework;
|
|
using Microsoft.Build.Utilities;
|
|
using Xamarin.Localization.MSBuild;
|
|
|
|
namespace Xamarin.MacDev.Tasks
|
|
{
|
|
public abstract class CollectBundleResourcesTaskBase : XamarinTask
|
|
{
|
|
#region Inputs
|
|
|
|
public ITaskItem[] BundleResources { get; set; }
|
|
|
|
public bool OptimizePropertyLists { get; set; }
|
|
|
|
public bool OptimizePNGs { get; set; }
|
|
|
|
[Required]
|
|
public string ProjectDir { get; set; }
|
|
|
|
[Required]
|
|
public string ResourcePrefix { get; set; }
|
|
|
|
#endregion
|
|
|
|
#region Outputs
|
|
|
|
[Output]
|
|
public ITaskItem[] BundleResourcesWithLogicalNames { get; set; }
|
|
|
|
#endregion
|
|
|
|
static bool CanOptimize (string path)
|
|
{
|
|
switch (Path.GetExtension (path).ToLowerInvariant ()) {
|
|
case ".png": case ".plist": case ".strings": return true;
|
|
default: return false;
|
|
}
|
|
}
|
|
|
|
public override bool Execute ()
|
|
{
|
|
var prefixes = BundleResource.SplitResourcePrefixes (ResourcePrefix);
|
|
var bundleResources = new List<ITaskItem> ();
|
|
|
|
if (BundleResources != null) {
|
|
foreach (var item in BundleResources) {
|
|
var logicalName = BundleResource.GetLogicalName (ProjectDir, prefixes, item, !string.IsNullOrEmpty(SessionId));
|
|
// We need a physical path here, ignore the Link element
|
|
var path = item.GetMetadata ("FullPath");
|
|
string illegal;
|
|
|
|
if (!File.Exists (path)) {
|
|
Log.LogError (MSBStrings.E0099, logicalName, path);
|
|
continue;
|
|
}
|
|
|
|
if (logicalName.StartsWith (".." + Path.DirectorySeparatorChar, StringComparison.Ordinal)) {
|
|
Log.LogError (null, null, null, item.ItemSpec, 0, 0, 0, 0, MSBStrings.E0100, logicalName);
|
|
continue;
|
|
}
|
|
|
|
if (logicalName == "Info.plist") {
|
|
Log.LogWarning (null, null, null, item.ItemSpec, 0, 0, 0, 0, MSBStrings.E0101);
|
|
continue;
|
|
}
|
|
|
|
if (BundleResource.IsIllegalName (logicalName, out illegal)) {
|
|
Log.LogError (null, null, null, item.ItemSpec, 0, 0, 0, 0, MSBStrings.E0102, illegal);
|
|
continue;
|
|
}
|
|
|
|
var bundleResource = new TaskItem (item);
|
|
bundleResource.SetMetadata ("LogicalName", logicalName);
|
|
|
|
bool optimize = false;
|
|
|
|
if (CanOptimize (item.ItemSpec)) {
|
|
var metadata = item.GetMetadata ("Optimize");
|
|
|
|
// fall back to old metadata name
|
|
if (string.IsNullOrEmpty (metadata))
|
|
metadata = item.GetMetadata ("OptimizeImage");
|
|
|
|
if (string.IsNullOrEmpty (metadata) || !bool.TryParse (metadata, out optimize)) {
|
|
switch (Path.GetExtension (item.ItemSpec).ToLowerInvariant ()) {
|
|
case ".plist": case ".strings": optimize = OptimizePropertyLists; break;
|
|
case ".png": optimize = OptimizePNGs; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
bundleResource.SetMetadata ("Optimize", optimize.ToString ());
|
|
|
|
bundleResources.Add (bundleResource);
|
|
}
|
|
}
|
|
|
|
BundleResourcesWithLogicalNames = bundleResources.ToArray ();
|
|
|
|
return !Log.HasLoggedErrors;
|
|
}
|
|
}
|
|
}
|