csharpc-sharpdotnetxamlavaloniauicross-platformcross-platform-xamlavaloniaguimulti-platformuser-interfacedotnetcore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.0 KiB
107 lines
4.0 KiB
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Microsoft.Build.Framework;
|
|
|
|
namespace Avalonia.Build.Tasks
|
|
{
|
|
public class CompileAvaloniaXamlTask: ITask
|
|
{
|
|
public bool Execute()
|
|
{
|
|
Enum.TryParse(ReportImportance, true, out MessageImportance outputImportance);
|
|
|
|
OutputPath = OutputPath ?? AssemblyFile;
|
|
RefOutputPath = RefOutputPath ?? RefAssemblyFile;
|
|
var outputPdb = GetPdbPath(OutputPath);
|
|
var input = AssemblyFile;
|
|
var refInput = RefOutputPath;
|
|
var inputPdb = GetPdbPath(input);
|
|
// Make a copy and delete the original file to prevent MSBuild from thinking that everything is OK
|
|
if (OriginalCopyPath != null)
|
|
{
|
|
var originalCopyPathRef = Path.ChangeExtension(OriginalCopyPath, ".ref.dll");
|
|
|
|
File.Copy(AssemblyFile, OriginalCopyPath, true);
|
|
input = OriginalCopyPath;
|
|
File.Delete(AssemblyFile);
|
|
|
|
if (File.Exists(inputPdb))
|
|
{
|
|
var copyPdb = GetPdbPath(OriginalCopyPath);
|
|
File.Copy(inputPdb, copyPdb, true);
|
|
File.Delete(inputPdb);
|
|
inputPdb = copyPdb;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(RefAssemblyFile) && File.Exists(RefAssemblyFile))
|
|
{
|
|
// We also copy ref assembly just for case if needed later for testing.
|
|
// But do not remove the original one, as MSBuild actually complains about it with multi-thread compiling.
|
|
File.Copy(RefAssemblyFile, originalCopyPathRef, true);
|
|
refInput = originalCopyPathRef;
|
|
}
|
|
}
|
|
|
|
var msg = $"CompileAvaloniaXamlTask -> AssemblyFile:{AssemblyFile}, ProjectDirectory:{ProjectDirectory}, OutputPath:{OutputPath}";
|
|
BuildEngine.LogMessage(msg, outputImportance < MessageImportance.Low ? MessageImportance.High : outputImportance);
|
|
|
|
var res = XamlCompilerTaskExecutor.Compile(BuildEngine,
|
|
input, OutputPath,
|
|
refInput, RefOutputPath,
|
|
File.ReadAllLines(ReferencesFilePath).Where(l => !string.IsNullOrWhiteSpace(l)).ToArray(),
|
|
ProjectDirectory, VerifyIl, DefaultCompileBindings, outputImportance,
|
|
(SignAssembly && !DelaySign) ? AssemblyOriginatorKeyFile : null, SkipXamlCompilation, DebuggerLaunch);
|
|
if (!res.Success)
|
|
return false;
|
|
if (!res.WrittenFile)
|
|
{
|
|
File.Copy(input, OutputPath, true);
|
|
if(File.Exists(inputPdb))
|
|
File.Copy(inputPdb, outputPdb, true);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
string GetPdbPath(string p)
|
|
{
|
|
var d = Path.GetDirectoryName(p);
|
|
var f = Path.GetFileNameWithoutExtension(p);
|
|
var rv = f + ".pdb";
|
|
if (d != null)
|
|
rv = Path.Combine(d, rv);
|
|
return rv;
|
|
}
|
|
|
|
[Required]
|
|
public string AssemblyFile { get; set; }
|
|
[Required]
|
|
public string ReferencesFilePath { get; set; }
|
|
[Required]
|
|
public string OriginalCopyPath { get; set; }
|
|
[Required]
|
|
public string ProjectDirectory { get; set; }
|
|
|
|
public string RefAssemblyFile { get; set; }
|
|
public string RefOutputPath { get; set; }
|
|
|
|
public string OutputPath { get; set; }
|
|
|
|
public bool VerifyIl { get; set; }
|
|
|
|
public bool DefaultCompileBindings { get; set; }
|
|
|
|
public bool SkipXamlCompilation { get; set; }
|
|
|
|
public string AssemblyOriginatorKeyFile { get; set; }
|
|
public bool SignAssembly { get; set; }
|
|
public bool DelaySign { get; set; }
|
|
|
|
public string ReportImportance { get; set; }
|
|
|
|
public IBuildEngine BuildEngine { get; set; }
|
|
public ITaskHost HostObject { get; set; }
|
|
|
|
public bool DebuggerLaunch { get; set; }
|
|
}
|
|
}
|
|
|