The build script now matches with the new structure

This commit is contained in:
SotoiGhost 2019-07-12 20:07:31 -05:00
Родитель 238e6ad123
Коммит 68277c6987
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 72EA2B8D62E38FAB
8 изменённых файлов: 731 добавлений и 1106 удалений

Просмотреть файл

@ -1,62 +1,65 @@
#addin nuget:?package=Cake.Xamarin.Build&version=4.0.1
#addin nuget:?package=Cake.FileHelpers&version=3.0.0
#addin nuget:?package=Cake.Yaml&version=2.1.0
#addin nuget:?package=Cake.Json&version=3.0.1
#tool nuget:?package=XamarinComponent&version=1.1.0.65
#addin nuget:?package=Cake.XCode&version=4.0.0
#addin nuget:?package=Newtonsoft.Json&version=9.0.1
#addin nuget:?package=YamlDotNet&version=4.2.1
#addin nuget:?package=Xamarin.Nuget.Validator&version=1.1.1
#addin nuget:?package=Cake.Xamarin.Build&version=4.0.1
#addin nuget:?package=Cake.Xamarin&version=3.0.0
#addin nuget:?package=Cake.FileHelpers&version=3.0.0
var TARGET = Argument ("target", Argument ("t", Argument ("Target", "build")));
#load "poco.cake"
#load "components.cake"
#load "common.cake"
#load "custom_externals_download.cake"
var GIT_PREVIOUS_COMMIT = EnvironmentVariable ("GIT_PREVIOUS_SUCCESSFUL_COMMIT") ?? Argument ("gitpreviouscommit", "");
var GIT_COMMIT = EnvironmentVariable ("GIT_COMMIT") ?? EnvironmentVariable ("GIT_CLONE_COMMIT_HASH") ?? Argument("gitcommit", "");
var GIT_BRANCH = EnvironmentVariable ("GIT_BRANCH") ?? EnvironmentVariable ("BITRISE_GIT_BRANCH") ?? "origin/master";
var GIT_PATH = EnvironmentVariable ("GIT_EXE") ?? (IsRunningOnWindows () ? "C:\\Program Files (x86)\\Git\\bin\\git.exe" : "git");
var TARGET = Argument ("t", Argument ("target", "build"));
var SDKS = Argument ("sdks", "");
var BUILD_GROUPS = DeserializeYamlFromFile<List<BuildGroup>> ("./manifest.yaml");
var BUILD_NAMES = Argument ("names", Argument ("name", Argument ("n", "")))
.Split (new [] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
var BUILD_TARGETS = Argument ("targets", Argument ("build-targets", Argument ("build-targets", Argument ("build", ""))))
.Split (new [] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
var SOLUTION_PATH = "./Xamarin.Google.sln";
// Artifacts that need to be built from pods or be copied from pods
var ARTIFACTS_TO_BUILD = new List<Artifact> ();
var FORCE_BUILD = Argument ("force", Argument ("forcebuild", Argument ("force-build", "false"))).ToLower ().Equals ("true");
var SOURCES_TARGETS = new List<string> ();
var SAMPLES_TARGETS = new List<string> {
@"Firebase\\AdMobSample",
@"Firebase\\AnalyticsSample",
@"Firebase\\AuthSample",
@"Firebase\\CloudFirestoreSample",
@"Firebase\\CloudMessagingSample",
@"Firebase\\CrashlyticsSample",
@"Firebase\\DatabaseSample",
@"Firebase\\DynamicLinksSample",
@"Firebase\\InvitesSample",
@"Firebase\\ModelInterpreterSample",
@"Firebase\\MLKitSample",
@"Firebase\\PerformanceMonitoringSample",
@"Firebase\\RemoteConfigSample",
@"Firebase\\StorageSample",
@"Google\\CuteAnimalsiOS",
@"Google\\AppIndexingSample",
@"Google\\CastSample",
@"Google\\InstanceIDSample",
@"Google\\GoogleMapsAdvSample",
@"Google\\GoogleMapsSample",
@"Google\\MobileAdsExample",
@"Google\\GooglePlacesSample",
@"Google\\SignInExample",
@"Google\\TagManagerSample"
};
var POD_REPO_UPDATE = Argument ("update", Argument ("repo-update", Argument ("pod-repo-update", false)));
// Print out environment variables to console
var ENV_VARS = EnvironmentVariables ();
Information ("Environment Variables: {0}", "");
foreach (var ev in ENV_VARS)
Information ("\t{0} = {1}", ev.Key, ev.Value);
CakeStealer.CakeContext = Context;
// From Cake.Xamarin.Build, dumps out versions of things
LogSystemInfo ();
// Print out git commit info
Information ("Git Path: {0}", GIT_PATH);
Information ("Git Previous Commit: {0}", GIT_PREVIOUS_COMMIT);
Information ("Git Commit: {0}", GIT_COMMIT);
Information ("Force Build: {0}", FORCE_BUILD);
public enum PodRepoUpdate {
NotRequired,
Required,
Forced
}
public class CakeStealer
{
static public ICakeContext CakeContext { get; set; }
}
// Podfile basic structure
var PODFILE_BEGIN = new [] {
"platform :ios, '{0}'",
"install! 'cocoapods', :integrate_targets => false",
"use_frameworks!",
"target 'XamarinGoogle' do",
};
var PODFILE_END = new [] {
"end",
};
FilePath GetCakeToolPath ()
{
var possibleExe = GetFiles ("./**/tools/Cake/Cake.exe").FirstOrDefault ();
if (possibleExe != null)
return possibleExe;
@ -64,294 +67,170 @@ FilePath GetCakeToolPath ()
return new FilePath (p.Modules[0].FileName);
}
void BuildSingleGroup (BuildGroup buildGroup)
void BuildCake (string target)
{
foreach (var target in buildGroup.BuildTargets) {
// TODO: Actually build this thing
var cakeSettings = new CakeSettings {
ToolPath = GetCakeToolPath (),
Arguments = new Dictionary<string, string> { { "target", target } },
Verbosity = Verbosity.Diagnostic
};
// Run the script from the subfolder
CakeExecuteScript (buildGroup.BuildScript, cakeSettings);
}
}
IEnumerable<string> ExecuteProcess (string file, string args)
{
IEnumerable<string> stdout;
StartProcess (file, new ProcessSettings {
Arguments = args,
RedirectStandardOutput = true },
out stdout);
return stdout;
}
void BuildGroups (List<BuildGroup> buildGroups, List<string> names, List<string> buildTargets, string gitPath, string gitBranch, string gitPreviousCommit, string gitCommit, bool forceBuild, PodRepoUpdate podRepoUpdate)
{
bool runningOnMac = IsRunningOnUnix ();
bool runningOnWin = IsRunningOnWindows ();
var groupsToBuild = new List<BuildGroup> ();
if (!forceBuild) {
// If neither commit hash was found, we can't detect changes
if (string.IsNullOrWhiteSpace (gitPreviousCommit) && string.IsNullOrWhiteSpace (gitCommit))
throw new CakeException ("GIT Commit/Previous Commit hashes were invalid, can't find affected files");
// Get all the changed files in this commit
IEnumerable<string> changedFiles = new List<string> ();
if (!string.IsNullOrWhiteSpace (gitPreviousCommit)) {
// We have both commit hashes (previous and current) so do a diff on them
changedFiles = ExecuteProcess (gitPath, "--no-pager diff --name-only " + gitPreviousCommit + " " + gitCommit);
// // TODO: This should be fixed in cake 0.7.0, right now it may hang on output
// StartProcess (gitPath, new ProcessSettings {
// Arguments = "--no-pager diff --name-only " + gitPreviousCommit + " " + gitCommit,
// RedirectStandardOutput = true,
// }, out changedFiles);
} else {
// We only have the current commit hash, so list files for this commit only
changedFiles = ExecuteProcess (gitPath, "--no-pager show --pretty=\"format:\" --name-only " + gitCommit);
// // TODO: This should be fixed in cake 0.7.0, right now it may hang on output
// StartProcess (gitPath, new ProcessSettings {
// Arguments = "--no-pager show --pretty=\"format:\" --name-only " + gitCommit,
// RedirectStandardOutput = true,
// }, out changedFiles);
}
Information ("Changed Files:");
foreach (var file in changedFiles) {
Information ("\t{0}", file);
if (podRepoUpdate == PodRepoUpdate.NotRequired && file.EndsWith ("Podfile"))
podRepoUpdate = PodRepoUpdate.Required;
foreach (var buildGroup in buildGroups) {
// If ignore triggers for the platform this is running on, do not add the group even if the trigger is matched
if ((buildGroup.IgnoreTriggersOnMac && runningOnMac) || (buildGroup.IgnoreTriggersOnWindows && runningOnWin))
continue;
foreach (var triggerPath in buildGroup.TriggerPaths) {
if (file.StartsWith (triggerPath.ToString ())) {
Information ("\t\tMatched: {0}", triggerPath);
if (!groupsToBuild.Contains (buildGroup))
groupsToBuild.Add (buildGroup);
break;
}
}
foreach (var triggerFile in buildGroup.TriggerFiles) {
if (file.Equals (triggerFile.ToString ())) {
Information ("\t\tMatched: {0}", triggerFile);
if (!groupsToBuild.Contains (buildGroup))
groupsToBuild.Add (buildGroup);
break;
}
}
}
}
} else {
podRepoUpdate = PodRepoUpdate.Forced;
Information ("Groups To Build: {0}", string.Join (", ", buildGroups));
groupsToBuild.AddRange (buildGroups);
}
// If a filter was specified use it
if (names != null && names.Any (n => !string.IsNullOrWhiteSpace (n))) {
Information ("Only building groups: {0}", string.Join (",", names));
groupsToBuild = groupsToBuild.Where (bg => names.Any (n => n.ToLower ().Trim () == bg.Name.ToLower ().Trim ())).ToList ();
}
if (groupsToBuild.Any ()) {
// Logging about the jobs and what platforms they can run on
Information ("Running On: Mac? {0} Win? {1}", runningOnMac, runningOnWin);
foreach (var gtb in groupsToBuild)
Information ("{0} Build on: Mac? {1} Win? {2}", gtb.Name, gtb.BuildOnMac, gtb.BuildOnWindows);
groupsToBuild = groupsToBuild.Where (bg => (bg.BuildOnMac && runningOnMac) || (bg.BuildOnWindows && runningOnWin)).ToList ();
// Replace build targets with custom specified build targets if any were specified
if (buildTargets != null && buildTargets.Any (bt => !string.IsNullOrWhiteSpace (bt))) {
foreach (var buildGroup in groupsToBuild) {
buildGroup.BuildTargets.Clear ();
buildGroup.BuildTargets.AddRange (buildTargets);
}
}
if (podRepoUpdate != PodRepoUpdate.NotRequired) {
string message = string.Empty;
if (podRepoUpdate == PodRepoUpdate.Forced)
message = "Forcing Cocoapods repo update...";
else
message = "A modified Podfile was found...";
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Started //");
Information ("////////////////////////////////////////");
Information ($"{message}\nUpdating Cocoapods repo...");
CocoaPodRepoUpdate ();
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Ended //");
Information ("////////////////////////////////////////");
}
if (!DirectoryExists ("./output/"))
CreateDirectory ("./output/");
// Write out some build information
SerializeJsonToFile ("./output/buildinfo.json", new BuildInfo {
BuiltGroups = groupsToBuild,
ManifestGroups = buildGroups
});
var groupsNameList = string.Join (", ", from gtb in groupsToBuild select gtb.Name);
if (groupsNameList.Length > 100)
groupsNameList = groupsNameList.Substring (0, 97) + "...";
var branchInfo = "";
if (gitBranch != "origin/master")
branchInfo = " (" + gitBranch + ")";
Information ("[BUILD_DESC]{0}{1}[/BUILD_DESC]", groupsNameList, branchInfo);
foreach (var buildGroup in groupsToBuild) {
Information ("Building {0} with Targets {1}", buildGroup.Name, string.Join (",", buildGroup.BuildTargets));
BuildSingleGroup (buildGroup);
}
} else {
Information ("No changed files affected any of the paths from the manifest.yaml! {0}", "Skipping Builds");
}
var artifacts = GetFiles ("./**/output/**/*");
Information ("Found Artifacts ({0})", artifacts.Count ());
foreach (var a in artifacts)
Information ("{0}", a);
var dlls = GetFiles ("./**/*.dll");
Information ("Found DLL's ({0})", dlls.Count ());
foreach (var d in dlls)
Information ("{0}", d);
}
public class BuildInfo
{
public List<BuildGroup> ManifestGroups { get; set; }
public List<BuildGroup> BuiltGroups { get; set; }
}
public class BuildGroup
{
public BuildGroup ()
{
Name = string.Empty;
TriggerPaths = new List<string> ();
TriggerFiles = new List<string> ();
WindowsBuildTargets = new List<string> ();
MacBuildTargets = new List<string> ();
IgnoreTriggersOnMac = false;
IgnoreTriggersOnWindows = false;
}
public string Name { get; set; }
public string BuildScript { get; set; }
public List<string> TriggerPaths { get; set; }
public List<string> TriggerFiles { get; set; }
public bool IgnoreTriggersOnMac { get; set; }
public bool IgnoreTriggersOnWindows { get; set; }
public List<string> WindowsBuildTargets { get; set; }
public List<string> MacBuildTargets { get; set; }
public bool BuildOnWindows { get { return WindowsBuildTargets != null && WindowsBuildTargets.Any (); } }
public bool BuildOnMac { get { return MacBuildTargets != null && MacBuildTargets.Any (); } }
public List<string> BuildTargets {
get {
return CakeStealer.CakeContext.IsRunningOnWindows () ? WindowsBuildTargets : MacBuildTargets;
}
}
public override string ToString ()
{
return Name;
}
}
Task ("build").Does (() =>
{
var buildTargets = new List<string> ();
if (BUILD_TARGETS != null && BUILD_TARGETS.Any ())
buildTargets.AddRange (BUILD_TARGETS);
if (FileExists ("./output/buildinfo.json") && FORCE_BUILD) {
Information ("Found {0} from Upstream project, overriding build group names...", "./output/buildinfo.json");
GIT_PREVIOUS_COMMIT = "";
GIT_COMMIT = "";
var buildInfo = DeserializeJsonFromFile<BuildInfo> ("./output/buildinfo.json");
BUILD_NAMES = (from bg in buildInfo.BuiltGroups select bg.Name).ToArray ();
Information ("Overriding build group names to: {0}", string.Join (", ", BUILD_NAMES));
}
PodRepoUpdate podRepoUpdate = POD_REPO_UPDATE ? PodRepoUpdate.Forced : PodRepoUpdate.NotRequired;
BuildGroups (BUILD_GROUPS, BUILD_NAMES.ToList (), buildTargets, GIT_PATH, GIT_BRANCH, GIT_PREVIOUS_COMMIT, GIT_COMMIT, FORCE_BUILD, podRepoUpdate);
});
Task("nuget-validation")
.Does(()=>
{
//setup validation options
var options = new Xamarin.Nuget.Validator.NugetValidatorOptions()
{
Copyright = "© Microsoft Corporation. All rights reserved.",
Author = "Microsoft",
Owner = "Microsoft",
NeedsProjectUrl = true,
NeedsLicenseUrl = true,
ValidateRequireLicenseAcceptance = true,
ValidPackageNamespace = new [] { "Xamarin", "Mono", "SkiaSharp", "HarfBuzzSharp", "mdoc" },
var cakeSettings = new CakeSettings {
ToolPath = GetCakeToolPath (),
Arguments = new Dictionary<string, string> { { "target", target }, { "sdks", SDKS } },
Verbosity = Verbosity.Diagnostic
};
var nupkgFiles = GetFiles ("./**/output/*.nupkg");
// Run the script from the subfolder
CakeExecuteScript ("./build.cake", cakeSettings);
}
Information ("Found ({0}) Nuget's to validate", nupkgFiles.Count ());
// From Cake.Xamarin.Build, dumps out versions of things
LogSystemInfo ();
foreach (var nupkgFile in nupkgFiles)
{
Information ("Verifiying Metadata of {0}", nupkgFile.GetFilename ());
Task("build")
.Does(() =>
{
BuildCake ("nuget");
BuildCake ("samples");
});
var result = Xamarin.Nuget.Validator.NugetValidator.Validate(MakeAbsolute(nupkgFile).FullPath, options);
// Prepares the artifacts to be built.
// From CI will always build everything but, locally you can customize what
// you build, just to save some time when testing locally.
Task("prepare-artifacts")
.IsDependeeOf("externals")
.Does(() =>
{
SetArtifactsDependencies ();
SetArtifactsPodSpecs ();
if (!result.Success)
{
Information ("Metadata validation failed for: {0} \n\n", nupkgFile.GetFilename ());
Information (string.Join("\n ", result.ErrorMessages));
throw new Exception ($"Invalid Metadata for: {nupkgFile.GetFilename ()}");
var orderedArtifactsForBuild = new List<Artifact> ();
}
else
{
Information ("Metadata validation passed for: {0}", nupkgFile.GetFilename ());
}
if (string.IsNullOrWhiteSpace (SDKS) || TARGET == "samples") {
orderedArtifactsForBuild.AddRange (ARTIFACTS.Values);
} else {
var sdks = SDKS.Split (',');
foreach (var sdk in sdks) {
if (!(ARTIFACTS.ContainsKey (sdk) && ARTIFACTS [sdk] is Artifact artifact))
throw new Exception($"The {sdk} component does not exist.");
orderedArtifactsForBuild.Add (artifact);
AddArtifactDependencies (orderedArtifactsForBuild, artifact.Dependencies);
}
orderedArtifactsForBuild = orderedArtifactsForBuild.Distinct ().ToList ();
}
orderedArtifactsForBuild.Sort ((f, s) => s.BuildOrder.CompareTo (f.BuildOrder));
ARTIFACTS_TO_BUILD.AddRange (orderedArtifactsForBuild);
Information ("Build order:");
foreach (var artifact in ARTIFACTS_TO_BUILD) {
SOURCES_TARGETS.Add($@"{artifact.ComponentGroup}\\{artifact.CsprojName.Replace ('.', '_')}");
Information (artifact.Id);
}
});
Task ("externals")
.WithCriteria (!DirectoryExists ("./externals/"))
.Does (() =>
{
EnsureDirectoryExists ("./externals/");
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Started //");
Information ("////////////////////////////////////////");
Information ("\nUpdating Cocoapods repo...");
CocoaPodRepoUpdate ();
Information ("////////////////////////////////////////");
Information ("// Pods Repo Update Ended //");
Information ("////////////////////////////////////////");
foreach (var artifact in ARTIFACTS_TO_BUILD) {
UpdateVersionInCsproj (artifact);
CreateAndInstallPodfile (artifact);
BuildSdkOnPodfile (artifact);
}
// Call here custom methods created at custom_externals_download.cake file
// to download frameworks and/or bundles for the artifact
});
Task ("libs")
.IsDependentOn("externals")
.Does(() =>
{
CleanVisualStudioSolution ();
var targets = $@"source\\{string.Join (@";source\\", SOURCES_TARGETS)}";
MSBuild(SOLUTION_PATH, c => {
c.Configuration = "Release";
c.Restore = true;
c.MaxCpuCount = 0;
c.Targets.Clear();
c.Targets.Add(targets);
});
});
Task ("samples")
.IsDependentOn("libs")
.Does(() =>
{
var targets = $@"samples\\{string.Join (@";samples\\", SAMPLES_TARGETS)}";
MSBuild(SOLUTION_PATH, c => {
c.Configuration = "Release";
c.Restore = true;
c.MaxCpuCount = 0;
c.Targets.Clear();
c.Targets.Add(targets);
});
});
Task ("nuget")
.IsDependentOn("libs")
.Does(() =>
{
EnsureDirectoryExists("./output");
var targets = $@"source\\{string.Join (@":Pack;source\\", SOURCES_TARGETS)}:Pack";
MSBuild(SOLUTION_PATH, c => {
c.Configuration = "Release";
c.Restore = true;
c.MaxCpuCount = 0;
c.Targets.Clear();
c.Targets.Add(targets);
c.Properties.Add("PackageOutputPath", new [] { "../../../output/" });
});
});
Task ("clean")
.Does (() =>
{
CleanVisualStudioSolution ();
var deleteDirectorySettings = new DeleteDirectorySettings {
Recursive = true,
Force = true
};
if (DirectoryExists ("./externals/"))
DeleteDirectory ("./externals", deleteDirectorySettings);
if (DirectoryExists ("./output/"))
DeleteDirectory ("./output", deleteDirectorySettings);
});
Teardown (context =>
{
var artifacts = GetFiles ("./output/**/*");
if (artifacts?.Count () <= 0)
return;
Information ($"Found Artifacts ({artifacts.Count ()})");
foreach (var a in artifacts)
Information ("{0}", a);
});
RunTarget (TARGET);

Просмотреть файл

@ -1,73 +1,212 @@
#tool nuget:?package=XamarinComponent&version=1.1.0.65
#load "poco.cake"
#addin nuget:?package=Cake.XCode&version=4.0.0
#addin nuget:?package=Cake.Xamarin.Build&version=4.0.1
#addin nuget:?package=Cake.Xamarin&version=3.0.0
#addin nuget:?package=Cake.FileHelpers&version=3.0.0
BuildSpec buildSpec = null;
void InvokeOtherGoogleModules (string [] otherPaths, string target)
void AddArtifactDependencies (List<Artifact> list, Artifact [] dependencies)
{
if (otherPaths == null)
if (dependencies == null)
return;
list.AddRange (dependencies);
var cakeSettings = new CakeSettings {
ToolPath = GetCakeToolPath (),
Arguments = new Dictionary<string, string> { { "target", target } },
};
// Run the script from the subfolder
foreach (var module in otherPaths)
CakeExecuteScript ("../" + module + "/build.cake", cakeSettings);
foreach (var dependency in dependencies)
AddArtifactDependencies (list, dependency.Dependencies);
}
string [] MyDependencies = null;
Task ("externals")
.Does (() =>
void UpdateVersionInCsproj (Artifact artifact)
{
if (DirectoryExists ("./externals/Pods/"))
return;
var componentGroup = artifact.ComponentGroup.ToString ();
var csprojPath = $"./source/{componentGroup}/{artifact.CsprojName}/{artifact.CsprojName}.csproj";
XmlPoke(csprojPath, "/Project/PropertyGroup/FileVersion", artifact.NugetVersion);
XmlPoke(csprojPath, "/Project/PropertyGroup/PackageVersion", artifact.NugetVersion);
}
InvokeOtherGoogleModules (MyDependencies, "externals");
RunMake ("./externals/", "all");
});
Task ("tmp-nuget").IsDependentOn ("libs").Does (() =>
void CreateAndInstallPodfile (Artifact artifact)
{
InvokeOtherGoogleModules (MyDependencies, "tmp-nuget");
if (buildSpec.NuGets == null || buildSpec.NuGets.Length == 0)
if (artifact.PodSpecs?.Length == 0)
return;
var podfile = new List<string> ();
var podfileBegin = new List<string> (PODFILE_BEGIN);
podfileBegin [0] = string.Format (podfileBegin [0], artifact.MinimunSupportedVersion);
podfile.AddRange (podfileBegin);
var newList = new List<NuGetInfo> ();
foreach (var podSpec in artifact.PodSpecs) {
if (podSpec.FrameworkSource != FrameworkSource.Pods)
continue;
foreach (var nuget in buildSpec.NuGets) {
newList.Add (new NuGetInfo {
BuildsOn = nuget.BuildsOn,
NuSpec = nuget.NuSpec,
RequireLicenseAcceptance = nuget.RequireLicenseAcceptance,
Version = nuget.Version,
OutputDirectory = "../tmp-nugets",
});
if (podSpec.SubSpecs == null) {
podfile.Add ($"\tpod '{podSpec.Name}', '{podSpec.Version}'");
continue;
}
if (podSpec.UseDefaultSubspecs)
podfile.Add ($"\tpod '{podSpec.Name}', '{podSpec.Version}'");
foreach (var subSpec in podSpec.SubSpecs)
podfile.Add ($"\tpod '{podSpec.Name}/{subSpec}', '{podSpec.Version}'");
}
PackNuGets (newList.ToArray ());
});
if (podfile.Count == PODFILE_BEGIN.Length)
return;
Task ("component").IsDependentOn ("nuget").IsDependentOn ("tmp-nuget").IsDependentOn ("component-base");
podfile.AddRange (PODFILE_END);
FilePath GetCakeToolPath ()
{
var possibleExe = GetFiles ("../**/tools/Cake/Cake.exe").FirstOrDefault ();
var podfilePath = $"./externals/{artifact.Id}";
EnsureDirectoryExists (podfilePath);
if (possibleExe != null)
return possibleExe;
var p = System.Diagnostics.Process.GetCurrentProcess ();
return new FilePath (p.Modules[0].FileName);
FileWriteLines ($"{podfilePath}/Podfile", podfile.ToArray ());
CocoaPodInstall (podfilePath);
}
void BuildSdkOnPodfile (Artifact artifact)
{
if (artifact.PodSpecs?.Length == 0)
return;
var platforms = new [] { Platform.iOSArm64, Platform.iOSArmV7, Platform.iOSSimulator64, Platform.iOSSimulator };
var podsProject = "./Pods/Pods.xcodeproj";
var workingDirectory = (DirectoryPath)$"./externals/{artifact.Id}";
foreach (var podSpec in artifact.PodSpecs)
{
if (podSpec.FrameworkSource != FrameworkSource.Pods || !podSpec.CanBeBuild)
continue;
var framework = $"{podSpec.FrameworkName}.framework";
var paths = GetDirectories($"{workingDirectory}/Pods/**/{framework}");
if (paths?.Count <= 0) {
BuildXcodeFatFramework (podsProject, podSpec.TargetName, platforms, libraryTitle: podSpec.FrameworkName, workingDirectory: workingDirectory);
CopyDirectory ($"{workingDirectory}/{framework}", $"./externals/{framework}");
} else {
foreach (var path in paths)
CopyDirectory (path, $"./externals/{framework}");
}
}
}
void CleanVisualStudioSolution ()
{
MSBuild(SOLUTION_PATH, c => {
c.Configuration = "Release";
c.Restore = true;
c.MaxCpuCount = 0;
c.Targets.Add("Clean");
});
var deleteDirectorySettings = new DeleteDirectorySettings {
Recursive = true,
Force = true
};
var bins = GetDirectories("./**/bin");
DeleteDirectories (bins, deleteDirectorySettings);
var objs = GetDirectories("./**/obj");
DeleteDirectories (objs, deleteDirectorySettings);
}
void BuildXcodeFatLibrary (FilePath xcodeProject, string target, Platform [] platforms, string libraryTitle = null, string librarySuffix = null, DirectoryPath workingDirectory = null)
{
if (!IsRunningOnUnix())
{
Warning("{0} is not available on the current platform.", "xcodebuild");
return;
}
libraryTitle = libraryTitle ?? target;
workingDirectory = workingDirectory ?? Directory("./externals/");
var libraryFile = (FilePath)(librarySuffix != null ? $"{libraryTitle}.{librarySuffix}" : $"{libraryTitle}");
var archsFiles = new List<FilePath> ();
var buildArch = new Action<string, string, FilePath>((sdk, arch, dest) => {
if (FileExists(dest))
return;
XCodeBuild(new XCodeBuildSettings
{
Project = workingDirectory.CombineWithFilePath(xcodeProject).ToString(),
Target = target,
Sdk = sdk,
Arch = arch,
Configuration = "Release",
});
var outputPath = workingDirectory.Combine("build").Combine($"Release-{sdk}").Combine (target).CombineWithFilePath($"lib{libraryTitle}.a");
CopyFile(outputPath, dest);
});
foreach (var platform in platforms) {
var archFile = $"{libraryTitle}-{platform.Arch}";
archsFiles.Add (archFile);
buildArch (platform.Sdk, platform.Arch, workingDirectory.CombineWithFilePath (archFile));
}
RunLipoCreate (workingDirectory, libraryTitle, archsFiles.ToArray ());
}
void BuildXcodeFatFramework (FilePath xcodeProject, string target, Platform [] platforms, string libraryTitle = null, string librarySuffix = null, DirectoryPath workingDirectory = null)
{
if (!IsRunningOnUnix ()) {
Warning("{0} is not available on the current platform.", "xcodebuild");
return;
}
libraryTitle = libraryTitle ?? target;
workingDirectory = workingDirectory ?? Directory("./externals/");
var libraryFile = (FilePath)(librarySuffix != null ? $"{libraryTitle}.{librarySuffix}" : $"{libraryTitle}");
var fatFramework = (DirectoryPath)$"{libraryTitle}.framework";
var fatFrameworkPath = workingDirectory.Combine (fatFramework);
var archsPaths = new List<FilePath> ();
var buildArch = new Action<string, string, DirectoryPath> ((sdk, arch, dest) => {
if (DirectoryExists (dest))
return;
XCodeBuild (new XCodeBuildSettings {
Project = workingDirectory.CombineWithFilePath (xcodeProject).ToString (),
Target = target,
Sdk = sdk,
Arch = arch,
Configuration = "Release",
});
var outputPath = workingDirectory.Combine ("build").Combine ($"Release-{sdk}").Combine (target).Combine (fatFramework);
CopyDirectory (outputPath, dest);
});
foreach (var platform in platforms) {
var archPath = (DirectoryPath)$"{libraryTitle}-{platform.Arch}.framework";
archsPaths.Add (archPath.CombineWithFilePath (libraryTitle));
buildArch (platform.Sdk, platform.Arch, workingDirectory.Combine (archPath));
if (!DirectoryExists (fatFrameworkPath))
CopyDirectory (workingDirectory.Combine (archPath), fatFrameworkPath);
}
RunLipoCreate (workingDirectory, fatFramework.CombineWithFilePath (libraryFile), archsPaths.ToArray ());
if (libraryTitle != target && FileExists (fatFrameworkPath.CombineWithFilePath (target)))
DeleteFile (fatFrameworkPath.CombineWithFilePath (target));
}
bool TargetExistsInXcodeProject (FilePath xcodeProject, string target, DirectoryPath workingDirectory = null)
{
workingDirectory = workingDirectory ?? Directory("./externals/");
var processSettings = new ProcessSettings {
Arguments = $"-project {workingDirectory.CombineWithFilePath (xcodeProject)} -list",
RedirectStandardOutput = true
};
using(var process = StartAndReturnProcess("xcodebuild", processSettings))
{
process.WaitForExit();
foreach (var line in process.GetStandardOutput ())
if (line.Contains (target))
return true;
return false;
}
}

207
components.cake Normal file
Просмотреть файл

@ -0,0 +1,207 @@
// Firebase artifacts available to be built. These artifacts generate NuGets.
Artifact FIREBASE_AB_TESTING_ARTIFACT = new Artifact ("Firebase.ABTesting", "2.0.0.2", "8.0", ComponentGroup.Firebase, csprojName: "ABTesting");
Artifact FIREBASE_AD_MOB_ARTIFACT = new Artifact ("Firebase.AdMob", "7.38.0", "8.0", ComponentGroup.Firebase, csprojName: "AdMob");
Artifact FIREBASE_ANALYTICS_ARTIFACT = new Artifact ("Firebase.Analytics", "5.5.0", "8.0", ComponentGroup.Firebase, csprojName: "Analytics");
Artifact FIREBASE_AUTH_ARTIFACT = new Artifact ("Firebase.Auth", "5.0.4.1", "8.0", ComponentGroup.Firebase, csprojName: "Auth");
Artifact FIREBASE_CLOUD_FIRESTORE_ARTIFACT = new Artifact ("Firebase.CloudFirestore", "0.13.3", "8.0", ComponentGroup.Firebase, csprojName: "CloudFirestore");
Artifact FIREBASE_CLOUD_MESSAGING_ARTIFACT = new Artifact ("Firebase.CloudMessaging", "3.1.2", "8.0", ComponentGroup.Firebase, csprojName: "CloudMessaging");
Artifact FIREBASE_CORE_ARTIFACT = new Artifact ("Firebase.Core", "5.2.0", "8.0", ComponentGroup.Firebase, csprojName: "Core");
Artifact FIREBASE_CRASHLYTICS_ARTIFACT = new Artifact ("Firebase.Crashlytics", "3.10.9", "8.0", ComponentGroup.Firebase, csprojName: "Crashlytics");
Artifact FIREBASE_DATABASE_ARTIFACT = new Artifact ("Firebase.Database", "5.0.3", "8.0", ComponentGroup.Firebase, csprojName: "Database");
Artifact FIREBASE_DYNAMIC_LINKS_ARTIFACT = new Artifact ("Firebase.DynamicLinks", "3.0.2.1", "8.0", ComponentGroup.Firebase, csprojName: "DynamicLinks");
Artifact FIREBASE_INSTANCE_ID_ARTIFACT = new Artifact ("Firebase.InstanceID", "3.4.0", "8.0", ComponentGroup.Firebase, csprojName: "InstanceID");
Artifact FIREBASE_INVITES_ARTIFACT = new Artifact ("Firebase.Invites", "3.0.1.2", "8.0", ComponentGroup.Firebase, csprojName: "Invites");
Artifact FIREBASE_MLKIT_ARTIFACT = new Artifact ("Firebase.MLKit", "0.13.0.1", "9.0", ComponentGroup.Firebase, csprojName: "MLKit");
Artifact FIREBASE_MLKIT_COMMON_ARTIFACT = new Artifact ("Firebase.MLCommon", "0.13.0", "9.0", ComponentGroup.Firebase, csprojName: "MLKit.Common");
Artifact FIREBASE_MLKIT_MODEL_INTERPRETER_ARTIFACT = new Artifact ("Firebase.MLModelInterpreter", "0.13.0", "9.0", ComponentGroup.Firebase, csprojName: "MLKit.ModelInterpreter");
Artifact FIREBASE_PERFORMANCE_MONITORING_ARTIFACT = new Artifact ("Firebase.PerformanceMonitoring", "2.1.2.1", "8.0", ComponentGroup.Firebase, csprojName: "PerformanceMonitoring");
Artifact FIREBASE_REMOTE_CONFIG_ARTIFACT = new Artifact ("Firebase.RemoteConfig", "3.0.1.1", "8.0", ComponentGroup.Firebase, csprojName: "RemoteConfig");
Artifact FIREBASE_STORAGE_ARTIFACT = new Artifact ("Firebase.Storage", "3.0.2", "8.0", ComponentGroup.Firebase, csprojName: "Storage");
// Google artifacts available to be built. These artifacts generate NuGets.
Artifact GOOGLE_ANALYTICS_ARTIFACT = new Artifact ("Google.Analytics", "3.17.0.3", "5.0", ComponentGroup.Google, csprojName: "Analytics");
Artifact GOOGLE_APP_INDEXING_ARTIFACT = new Artifact ("Google.AppIndexing", "2.0.3.5", "7.0", ComponentGroup.Google, csprojName: "AppIndexing");
Artifact GOOGLE_CAST_ARTIFACT = new Artifact ("Google.Casr", "4.4.2", "8.0", ComponentGroup.Google, csprojName: "Cast");
Artifact GOOGLE_CORE_ARTIFACT = new Artifact ("Google.Core", "3.1.0.1", "7.0", ComponentGroup.Google, csprojName: "Core");
Artifact GOOGLE_INSTANCE_ID_ARTIFACT = new Artifact ("Google.InstanceID", "1.2.1.15", "7.0", ComponentGroup.Google, csprojName: "InstanceID");
Artifact GOOGLE_MAPS_ARTIFACT = new Artifact ("Google.Maps", "3.1.0", "9.0", ComponentGroup.Google, csprojName: "Maps");
Artifact GOOGLE_MOBILE_ADS_ARTIFACT = new Artifact ("Google.MobileAds", "7.38.0", "8.0", ComponentGroup.Google, csprojName: "MobileAds");
Artifact GOOGLE_PLACES_ARTIFACT = new Artifact ("Google.Places", "3.1.0", "9.0", ComponentGroup.Google, csprojName: "Places");
Artifact GOOGLE_SIGN_IN_ARTIFACT = new Artifact ("Google.SignIn", "4.4.0", "8.0", ComponentGroup.Google, csprojName: "SignIn");
Artifact GOOGLE_TAG_MANAGER_ARTIFACT = new Artifact ("Google.TagManager", "7.1.1.2", "8.0", ComponentGroup.Google, csprojName: "TagManager");
var ARTIFACTS = new Dictionary<string, Artifact> {
{ "Firebase.ABTesting", FIREBASE_AB_TESTING_ARTIFACT },
{ "Firebase.AdMob", FIREBASE_AD_MOB_ARTIFACT },
{ "Firebase.Analytics", FIREBASE_ANALYTICS_ARTIFACT },
{ "Firebase.Auth", FIREBASE_AUTH_ARTIFACT },
{ "Firebase.CloudFirestore", FIREBASE_CLOUD_FIRESTORE_ARTIFACT },
{ "Firebase.CloudMessaging", FIREBASE_CLOUD_MESSAGING_ARTIFACT },
{ "Firebase.Core", FIREBASE_CORE_ARTIFACT },
{ "Firebase.Crashlytics", FIREBASE_CRASHLYTICS_ARTIFACT },
{ "Firebase.Database", FIREBASE_DATABASE_ARTIFACT },
{ "Firebase.DynamicLinks", FIREBASE_DYNAMIC_LINKS_ARTIFACT },
{ "Firebase.InstanceID", FIREBASE_INSTANCE_ID_ARTIFACT },
{ "Firebase.Invites", FIREBASE_INVITES_ARTIFACT },
{ "Firebase.MLKit", FIREBASE_MLKIT_ARTIFACT },
{ "Firebase.MLKit.Common", FIREBASE_MLKIT_COMMON_ARTIFACT },
{ "Firebase.MLKit.ModelInterpreter", FIREBASE_MLKIT_MODEL_INTERPRETER_ARTIFACT },
{ "Firebase.PerformanceMonitoring", FIREBASE_PERFORMANCE_MONITORING_ARTIFACT },
{ "Firebase.RemoteConfig", FIREBASE_REMOTE_CONFIG_ARTIFACT },
{ "Firebase.Storage", FIREBASE_STORAGE_ARTIFACT },
{ "Google.Analytics", GOOGLE_ANALYTICS_ARTIFACT },
{ "Google.Appindexing", GOOGLE_APP_INDEXING_ARTIFACT },
{ "Google.Cast", GOOGLE_CAST_ARTIFACT },
{ "Google.Core", GOOGLE_CORE_ARTIFACT },
{ "Google.InstanceID", GOOGLE_INSTANCE_ID_ARTIFACT },
{ "Google.Maps", GOOGLE_MAPS_ARTIFACT },
{ "Google.MobileAds", GOOGLE_MOBILE_ADS_ARTIFACT },
{ "Google.Places", GOOGLE_PLACES_ARTIFACT },
{ "Google.SignIn", GOOGLE_SIGN_IN_ARTIFACT },
{ "Google.TagManager", GOOGLE_TAG_MANAGER_ARTIFACT },
};
void SetArtifactsDependencies ()
{
FIREBASE_AB_TESTING_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT };
FIREBASE_AD_MOB_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT, GOOGLE_MOBILE_ADS_ARTIFACT };
FIREBASE_ANALYTICS_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT };
FIREBASE_AUTH_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
FIREBASE_CLOUD_FIRESTORE_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT };
FIREBASE_CLOUD_MESSAGING_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
FIREBASE_CORE_ARTIFACT.Dependencies = null;
FIREBASE_CRASHLYTICS_ARTIFACT.Dependencies = null;
FIREBASE_DATABASE_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
FIREBASE_DYNAMIC_LINKS_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT };
FIREBASE_INSTANCE_ID_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
FIREBASE_INVITES_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT, FIREBASE_DYNAMIC_LINKS_ARTIFACT, GOOGLE_SIGN_IN_ARTIFACT };
FIREBASE_MLKIT_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_MLKIT_COMMON_ARTIFACT };
FIREBASE_MLKIT_COMMON_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
FIREBASE_MLKIT_MODEL_INTERPRETER_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_MLKIT_COMMON_ARTIFACT };
FIREBASE_PERFORMANCE_MONITORING_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT };
FIREBASE_REMOTE_CONFIG_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT, FIREBASE_AB_TESTING_ARTIFACT };
FIREBASE_STORAGE_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
GOOGLE_ANALYTICS_ARTIFACT.Dependencies = null;
GOOGLE_APP_INDEXING_ARTIFACT.Dependencies = null;
GOOGLE_CAST_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
GOOGLE_CORE_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT };
GOOGLE_INSTANCE_ID_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT, GOOGLE_CORE_ARTIFACT };
GOOGLE_MAPS_ARTIFACT.Dependencies = null;
GOOGLE_MOBILE_ADS_ARTIFACT.Dependencies = null;
GOOGLE_PLACES_ARTIFACT.Dependencies = new [] { GOOGLE_MAPS_ARTIFACT };
GOOGLE_SIGN_IN_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT };
GOOGLE_TAG_MANAGER_ARTIFACT.Dependencies = new [] { FIREBASE_CORE_ARTIFACT, FIREBASE_INSTANCE_ID_ARTIFACT, FIREBASE_ANALYTICS_ARTIFACT, GOOGLE_ANALYTICS_ARTIFACT };
}
void SetArtifactsPodSpecs ()
{
// Firebase components
FIREBASE_AB_TESTING_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", subSpecs: new [] { "ABTesting" })
};
FIREBASE_AD_MOB_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.16.0", subSpecs: new [] { "AdMob" })
};
FIREBASE_ANALYTICS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.16.0", subSpecs: new [] { "Analytics" }),
new PodSpec ("GoogleAppMeasurement", "5.5.0")
};
FIREBASE_AUTH_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseAuth", targetName: "FirebaseAuth", subSpecs: new [] { "Auth" })
};
FIREBASE_CLOUD_FIRESTORE_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseFirestore", targetName: "FirebaseFirestore", subSpecs: new [] { "Firestore" }),
new PodSpec ("BoringSSL", "10.0.6", frameworkSource: FrameworkSource.Pods, frameworkName: "openssl"),
new PodSpec ("gRPC-ProtoRPC", "1.14.0", frameworkSource: FrameworkSource.Pods, frameworkName: "ProtoRPC"),
new PodSpec ("gRPC", "1.14.0", frameworkSource: FrameworkSource.Pods, frameworkName: "GRPCClient"),
new PodSpec ("gRPC-Core", "1.14.0", frameworkSource: FrameworkSource.Pods, frameworkName: "grpc"),
new PodSpec ("gRPC-RxLibrary", "1.14.0", frameworkSource: FrameworkSource.Pods, frameworkName: "RxLibrary"),
new PodSpec ("gRPC-C++", "0.0.3", frameworkSource: FrameworkSource.Pods, frameworkName: "grpcpp"),
};
FIREBASE_CLOUD_MESSAGING_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseMessaging", targetName: "FirebaseMessaging", subSpecs: new [] { "Messaging" })
};
FIREBASE_CORE_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.16.0", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseCore", targetName: "FirebaseCore", subSpecs: new [] { "CoreOnly" }),
new PodSpec ("FirebaseAuthInterop", "1.0.0", frameworkSource: FrameworkSource.Pods, canBeBuild: false),
new PodSpec ("GoogleUtilities", "5.3.7", frameworkSource: FrameworkSource.Pods, subSpecs: new [] { "AppDelegateSwizzler", "Environment", "ISASwizzler", "Logger", "MethodSwizzler", "Network", "NSData+zlib", "Reachability", "UserDefaults" }),
new PodSpec ("GoogleToolboxForMac", "2.1.4", frameworkSource: FrameworkSource.Pods, subSpecs: new [] { "NSData+zlib", "NSDictionary+URLArguments", "Logger", "StringEncoding", "URLBuilder" }),
new PodSpec ("GoogleAPIClientForREST", "1.3.7", frameworkSource: FrameworkSource.Pods, subSpecs: new [] { "Vision" }, useDefaultSubspecs: true),
new PodSpec ("GTMSessionFetcher", "1.2.1", frameworkSource: FrameworkSource.Pods, subSpecs: new [] { "Full" }),
new PodSpec ("leveldb-library", "1.20.0", frameworkSource: FrameworkSource.Pods, frameworkName: "leveldb"),
new PodSpec ("nanopb", "0.3.901", frameworkSource: FrameworkSource.Pods),
new PodSpec ("Protobuf", "3.6.1", frameworkSource: FrameworkSource.Pods),
};
FIREBASE_CRASHLYTICS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Crashlytics", "3.10.9"),
new PodSpec ("Fabric", "1.7.13")
};
FIREBASE_DATABASE_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseDatabase", targetName: "FirebaseDatabase", subSpecs: new [] { "Database" })
};
FIREBASE_DYNAMIC_LINKS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", subSpecs: new [] { "DynamicLinks" })
};
FIREBASE_INSTANCE_ID_ARTIFACT.PodSpecs = new [] {
new PodSpec ("FirebaseInstanceID", "3.4.0")
};
FIREBASE_INVITES_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", subSpecs: new [] { "Invites" })
};
FIREBASE_MLKIT_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.13.0", subSpecs: new [] { "MLVision", "MLVisionBarcodeModel", "MLVisionFaceModel", "MLVisionLabelModel", "MLVisionTextModel" }),
new PodSpec ("GoogleMobileVision", "1.5.0")
};
FIREBASE_MLKIT_COMMON_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.13.0", subSpecs: new [] { "MLCommon" })
};
FIREBASE_MLKIT_MODEL_INTERPRETER_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.13.0", subSpecs: new [] { "MLModelInterpreter" }),
new PodSpec ("TensorFlowLite", "1.10.1")
};
FIREBASE_PERFORMANCE_MONITORING_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", subSpecs: new [] { "Performance" })
};
FIREBASE_REMOTE_CONFIG_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", subSpecs: new [] { "RemoteConfig" })
};
FIREBASE_STORAGE_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Firebase", "5.8.1", frameworkSource: FrameworkSource.Pods, frameworkName: "FirebaseStorage", targetName: "FirebaseStorage", subSpecs: new [] { "Storage" })
};
// Google components
GOOGLE_ANALYTICS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GoogleAnalytics", "3.17.0")
};
GOOGLE_APP_INDEXING_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GoogleAppIndexing", "2.0.3")
};
GOOGLE_CAST_ARTIFACT.PodSpecs = new [] {
new PodSpec ("google-cast-sdk", "4.3.2")
};
GOOGLE_CORE_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Google", "3.1.0", subSpecs: new [] { "Core" })
};
GOOGLE_INSTANCE_ID_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GGLInstanceID", "1.2.1"),
new PodSpec ("GoogleIPhoneUtilities", "1.2.0")
};
GOOGLE_MAPS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GoogleMaps", "3.1.0")
};
GOOGLE_MOBILE_ADS_ARTIFACT.PodSpecs = new [] {
new PodSpec ("Google-Mobile-Ads-SDK", "7.38.0"),
new PodSpec ("PersonalizedAdConsent", "1.0.3", frameworkSource: FrameworkSource.Pods)
};
GOOGLE_PLACES_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GooglePlaces", "3.1.0")
};
GOOGLE_SIGN_IN_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GoogleSignIn", "4.4.0")
};
GOOGLE_TAG_MANAGER_ARTIFACT.PodSpecs = new [] {
new PodSpec ("GoogleTagManager", "7.1.1")
};
}

0
components.xml Normal file
Просмотреть файл

Просмотреть файл

509
poco.cake
Просмотреть файл

@ -1,394 +1,143 @@
/////////////////////////////////////////////////////////////////////
// Objects used to update a Google Component with its dependencies //
/////////////////////////////////////////////////////////////////////
public abstract class GoogleBase
enum ComponentGroup
{
public virtual string Name { get; }
public virtual string NuGetId { get; }
public string CurrentVersion { get; set; }
public string NewVersion { get; set; }
public bool Bumped { get; set; }
public virtual string [] BaseOf {
get { return new string[] { }; }
Firebase,
Google
}
enum FrameworkSource
{
Targets,
Pods,
Custom
}
struct Platform
{
#region Properties
public string Arch { get; private set; }
public string Sdk { get; private set; }
public static Platform iOSSimulator { get; } = new Platform ("i386", "iphonesimulator");
public static Platform iOSSimulator64 { get; } = new Platform ("x86_64", "iphonesimulator");
public static Platform iOSArmV7 { get; } = new Platform ("armv7", "iphoneos");
public static Platform iOSArmV7s { get; } = new Platform ("armv7s", "iphoneos");
public static Platform iOSArm64 { get; } = new Platform ("arm64", "iphoneos");
#endregion
#region Constructors
Platform (string arch, string sdk) {
Arch = arch;
Sdk = sdk;
}
#endregion
#region Public Functionality
public static Platform Create (string arch, string sdk) => new Platform (arch, sdk);
public override string ToString () => $"{Arch} => {Sdk}";
#endregion
#region Operations
public static bool operator == (Platform first, Platform second) =>
string.Equals (first.ToString (), second.ToString ());
public static bool operator != (Platform first, Platform second) =>
!string.Equals (first.ToString (), second.ToString ());
public override bool Equals (object obj) =>
obj is Platform platform && this == platform;
public override int GetHashCode () =>
base.GetHashCode ();
#endregion
}
class PodSpec
{
// The podspec name
public string Name { get; set; }
// The podspec version if any, the component version otherwise.
public string Version { get; set; }
// Target used to build the Xcode Pods project.
// If null, Name property value will be used.
public string TargetName { get; set; }
// Overrides the default framework's name built with Pods project and Xcode.
// If null, Name property value will be used.
public string FrameworkName { get; set; }
// The desired subspec to be used.
// If null, default subspecs defined within the podspec will be used.
public string [] SubSpecs { get; set; }
// If true and when Subspecs property is not null, default subspecs
// defined within the podspec will added to the Podfile. Otherwise,
// only subSpecs specified in Subspecs will be used. False by default.
public bool UseDefaultSubspecs { get; set; }
// Specify the source where the framework will be gotten.
// From a .targets file by default.
public FrameworkSource FrameworkSource { get; set; }
// If true, the podspec can be built using Xcode. True by default.
public bool CanBeBuild { get; set; }
public PodSpec (string name, string version, string targetName = null, string frameworkName = null, FrameworkSource frameworkSource = FrameworkSource.Targets, string [] subSpecs = null, bool useDefaultSubspecs = false, bool canBeBuild = true)
{
Name = name;
Version = version;
TargetName = targetName ?? name;
FrameworkName = frameworkName ?? name;
FrameworkSource = frameworkSource;
SubSpecs = subSpecs;
UseDefaultSubspecs = useDefaultSubspecs;
CanBeBuild = canBeBuild;
}
}
public abstract class Firebase
class Artifact : IEquatable<Artifact>
{
public class ABTesting : GoogleBase
// The id of the component.
public string Id { get; set; }
// The version to be published on NuGet.
public string NugetVersion { get; set; }
// The minimun iOS supported version of the component.
public string MinimunSupportedVersion { get; set; }
// If it's a Firebase or Google component.
public ComponentGroup ComponentGroup { get; set; }
// The C# project name. This will have the Id property value if not specified.
public string CsprojName { get; set; }
// Other Google/Firebase components that make this component work.
public Artifact [] Dependencies { get; set; }
// The component build order.
public int BuildOrder { get => Dependencies?.Length + 1 ?? 1; }
// The specs used in the Podfile.
public PodSpec [] PodSpecs { get; set; }
public Artifact (string id, string nugetVersion, string minimunSupportedVersion, ComponentGroup componentType, string csprojName = null, Artifact [] dependencies = null, PodSpec [] podSpecs = null)
{
public override string Name {
get { return "Firebase.ABTesting"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.ABTesting"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.RemoteConfig ().Name }; }
}
Id = id;
NugetVersion = nugetVersion;
MinimunSupportedVersion = minimunSupportedVersion;
ComponentGroup = componentType;
CsprojName = csprojName ?? id;
Dependencies = dependencies;
PodSpecs = podSpecs;
}
public class AdMob : GoogleBase
public bool Equals (Artifact other)
{
public override string Name {
get { return "Firebase.AdMob"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.AdMob"; }
}
if (Object.ReferenceEquals(other, null)) return false;
if (Object.ReferenceEquals(this, other)) return true;
return Id == other.Id;
}
public class Analytics : GoogleBase
public override int GetHashCode()
{
public override string Name {
get { return "Firebase.Analytics"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Analytics"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.ABTesting ().Name, new Firebase.AdMob ().Name, new Firebase.DynamicLinks ().Name,
new Firebase.Invites ().Name, new Firebase.PerformanceMonitoring ().Name, new Firebase.RemoteConfig ().Name,
new Google.InstanceID ().Name, new Google.TagManager ().Name };
}
}
}
public class Auth : GoogleBase
{
public override string Name {
get { return "Firebase.Auth"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Auth"; }
}
}
public class CloudFirestore : GoogleBase
{
public override string Name {
get { return "Firebase.CloudFirestore"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.CloudFirestore"; }
}
}
public class CloudMessaging : GoogleBase
{
public override string Name {
get { return "Firebase.CloudMessaging"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.CloudMessaging"; }
}
}
public class Core : GoogleBase
{
public override string Name {
get { return "Firebase.Core"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Core"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.ABTesting ().Name, new Firebase.AdMob ().Name, new Firebase.Analytics ().Name,
new Firebase.Auth ().Name, new Firebase.CloudFirestore ().Name, new Firebase.CloudMessaging ().Name,
new Firebase.Database ().Name, new Firebase.DynamicLinks ().Name, new Firebase.InstanceID ().Name,
new Firebase.Invites ().Name, new Firebase.MLKit ().Name, new Firebase.MLKit.Common ().Name,
new Firebase.MLKit.ModelInterpreter ().Name, new Firebase.PerformanceMonitoring ().Name, new Firebase.RemoteConfig ().Name,
new Firebase.Storage ().Name, new Google.Cast ().Name, new Google.InstanceID ().Name,
new Google.PlayGames ().Name, new Google.SignIn ().Name, new Google.TagManager ().Name };
}
}
}
public class Crashlytics : GoogleBase
{
public override string Name {
get { return "Firebase.Crashlytics"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Crashlytics"; }
}
}
public class CrashReporting : GoogleBase
{
public override string Name {
get { return "Firebase.CrashReporting"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.CrashReporting"; }
}
}
public class Database : GoogleBase
{
public override string Name {
get { return "Firebase.Database"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Database"; }
}
}
public class DynamicLinks : GoogleBase
{
public override string Name {
get { return "Firebase.DynamicLinks"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.DynamicLinks"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.Invites ().Name }; }
}
}
public class InstanceID : GoogleBase
{
public override string Name {
get { return "Firebase.InstanceID"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.InstanceID"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.ABTesting ().Name, new Firebase.AdMob ().Name, new Firebase.Analytics ().Name,
new Firebase.CloudMessaging ().Name, new Firebase.DynamicLinks ().Name, new Firebase.Invites ().Name,
new Firebase.MLKit.ModelInterpreter ().Name, new Firebase.PerformanceMonitoring ().Name, new Firebase.RemoteConfig ().Name,
new Google.InstanceID ().Name, new Google.TagManager ().Name };
}
}
}
public class Invites : GoogleBase
{
public override string Name {
get { return "Firebase.Invites"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Invites"; }
}
}
public class MLKit : GoogleBase
{
public override string Name {
get { return "Firebase.MLKit"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.MLKit"; }
}
public class Common : MLKit
{
public override string Name {
get { return "Firebase.MLKit.Common"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.MLKit.Common"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.MLKit ().Name, new Firebase.MLKit.ModelInterpreter ().Name }; }
}
}
public class ModelInterpreter : MLKit
{
public override string Name {
get { return "Firebase.MLKit.ModelInterpreter"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.MLKit.ModelInterpreter"; }
}
}
}
public class PerformanceMonitoring : GoogleBase
{
public override string Name {
get { return "Firebase.PerformanceMonitoring"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.PerformanceMonitoring"; }
}
}
public class RemoteConfig : GoogleBase
{
public override string Name {
get { return "Firebase.RemoteConfig"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.RemoteConfig"; }
}
}
public class Storage : GoogleBase
{
public override string Name {
get { return "Firebase.Storage"; }
}
public override string NuGetId {
get { return "Xamarin.Firebase.iOS.Storage"; }
}
int hashCode = Id.GetHashCode();
return hashCode ^ hashCode;
}
}
public abstract class Google
{
public class Analytics : GoogleBase
{
public override string Name {
get { return "Google.Analytics"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.Analytics"; }
}
public override string [] BaseOf {
get { return new [] { new Google.TagManager ().Name }; }
}
}
public class AppIndexing : GoogleBase
{
public override string Name {
get { return "Google.AppIndexing"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.AppIndexing"; }
}
}
public class Cast : GoogleBase
{
public override string Name {
get { return "Google.Cast"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.Cast"; }
}
}
public class Core : GoogleBase
{
public override string Name {
get { return "Google.Core"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.Core"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.Invites ().Name, new Google.InstanceID ().Name, new Google.PlayGames ().Name, new Google.SignIn ().Name }; }
}
}
public class InstanceID : GoogleBase
{
public override string Name {
get { return "Google.InstanceID"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.InstanceID"; }
}
}
public class Maps : GoogleBase
{
public override string Name {
get { return "Google.Maps"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.Maps"; }
}
}
public class MobileAds : GoogleBase
{
public override string Name {
get { return "Google.MobileAds"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.MobileAds"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.AdMob ().Name }; }
}
}
public class Places : GoogleBase
{
public override string Name {
get { return "Google.Places"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.Places"; }
}
}
public class PlayGames : GoogleBase
{
public override string Name {
get { return "Google.PlayGames"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.PlayGames"; }
}
}
public class SignIn : GoogleBase
{
public override string Name {
get { return "Google.SignIn"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.SignIn"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.Invites ().Name, new Google.PlayGames ().Name }; }
}
}
public class TagManager : GoogleBase
{
public override string Name {
get { return "Google.TagManager"; }
}
public override string NuGetId {
get { return "Xamarin.Google.iOS.TagManager"; }
}
}
}
public abstract class Xamarin
{
public abstract class Build
{
public class Download : GoogleBase
{
public override string Name {
get { return "Xamarin.Build.Download"; }
}
public override string NuGetId {
get { return "Xamarin.Build.Download"; }
}
public override string [] BaseOf {
get { return new [] { new Firebase.ABTesting ().Name, new Firebase.AdMob ().Name, new Firebase.Analytics ().Name,
new Firebase.Auth ().Name, new Firebase.CloudFirestore ().Name, new Firebase.CloudMessaging ().Name,
new Firebase.Core ().Name, new Firebase.Crashlytics ().Name, new Firebase.Database ().Name,
new Firebase.DynamicLinks ().Name, new Firebase.InstanceID ().Name, new Firebase.Invites ().Name,
new Firebase.PerformanceMonitoring ().Name, new Firebase.RemoteConfig ().Name, new Firebase.Storage ().Name,
new Google.Analytics ().Name, new Google.AppIndexing ().Name, new Google.Cast ().Name,
new Google.InstanceID ().Name, new Firebase.MLKit ().Name, new Firebase.MLKit.Common ().Name,
new Firebase.MLKit.ModelInterpreter ().Name, new Google.Maps ().Name, new Google.MobileAds ().Name,
new Google.Places ().Name, new Google.PlayGames ().Name, new Google.SignIn ().Name,
new Google.TagManager ().Name };
}
}
}
}
}

Просмотреть файл

@ -1,95 +0,0 @@
///////////////////////////////////////////////
// Objects used to represent a *.nuspec file //
///////////////////////////////////////////////
public class NuspecFile
{
[System.Xml.Serialization.XmlAttribute ("src")]
public string Source { get; set; }
[System.Xml.Serialization.XmlAttribute ("target")]
public string Target { get; set; }
}
[XmlRoot ("dependency")]
public class Dependency
{
[System.Xml.Serialization.XmlAttribute ("id")]
public string Id { get; set; }
[System.Xml.Serialization.XmlAttribute ("version")]
public string Version { get; set; }
}
public class Group
{
[System.Xml.Serialization.XmlAttribute ("targetFramework")]
public string TargetFramework { get; set; }
[System.Xml.Serialization.XmlElement ("dependency")]
public List<Dependency> Dependencies { get; set; }
}
[XmlRoot ("metadata")]
public class Metadata
{
[System.Xml.Serialization.XmlElement ("id")]
public string Id { get; set; }
[System.Xml.Serialization.XmlElement ("title")]
public string Title { get; set; }
[System.Xml.Serialization.XmlElement ("version")]
public string Version { get; set; }
[System.Xml.Serialization.XmlElement ("authors")]
public string Authors { get; set; }
[System.Xml.Serialization.XmlElement ("owners")]
public string Owners { get; set; }
[System.Xml.Serialization.XmlElement ("requireLicenseAcceptance", Type = typeof (bool))]
public bool RequireLicenseAcceptance { get; set; }
[System.Xml.Serialization.XmlElement ("description")]
public string Description { get; set; }
[System.Xml.Serialization.XmlElement ("copyright")]
public string Copyright { get; set; }
[System.Xml.Serialization.XmlElement ("projectUrl")]
public string ProjectUrl { get; set; }
[System.Xml.Serialization.XmlElement ("licenseUrl")]
public string LicenseUrl { get; set; }
[System.Xml.Serialization.XmlElement ("iconUrl")]
public string IconUrl { get; set; }
[System.Xml.Serialization.XmlArray ("dependencies")]
[System.Xml.Serialization.XmlArrayItem ("group")]
public List<Group> DependenciesGroups { get; set; }
}
[System.Xml.Serialization.XmlRoot ("package")]
public class Nuspec
{
[System.Xml.Serialization.XmlElement ("metadata")]
public Metadata Metadata { get; set; }
[System.Xml.Serialization.XmlArray ("files")]
[System.Xml.Serialization.XmlArrayItem ("file")]
public List<NuspecFile> Files { get; set; }
}
public class NoEncodingStreamWriter : System.IO.StreamWriter
{
public override System.Text.Encoding Encoding {
get { return null; }
}
public NoEncodingStreamWriter (string path) : base (path)
{
}
}

Просмотреть файл

@ -1,254 +0,0 @@
/////////////////////////////////////////////////////
// Objects used to represent a component.yaml file //
/////////////////////////////////////////////////////
// public abstract class PathsBase
// {
// [YamlMember(Alias = "ios-unified")]
// public List<string> iOSUnifiedPaths { get; set; }
// [YamlMember(Alias = "ios")]
// public List<string> iOSPaths { get; set; }
// [YamlMember(Alias = "android")]
// public List<string> AndroidPaths { get; set; }
// }
// public class Libraries : PathsBase
// {
// }
// public class Packages : PathsBase
// {
// }
// public class AdditionalFile
// {
// [YamlMember(Alias = "source")]
// public string SourcePath { get; set; }
// [YamlMember(Alias = "destination")]
// public string DestinationPath { get; set; }
// }
// public class NuGetInstaller
// {
// [YamlMember(Alias = "project")]
// public string ProjectName { get; set; }
// [YamlMember(Alias = "packages")]
// public List<string> PackagesNames { get; set; }
// }
// public class Sample
// {
// [YamlMember(Alias = "name")]
// public string Name { get; set; }
// [YamlMember(Alias = "path")]
// public string Path { get; set; }
// [YamlMember(Alias = "removeProjects")]
// public List<string> ProjectsToRemove { get; set; }
// [YamlMember(Alias = "installNuGets")]
// public NuGetInstaller NuGetsToInstall { get; set; }
// [YamlMember(Alias = "removeFiles")]
// public List<string> FilesToRemove { get; set; }
// [YamlMember(Alias = "removeNodes")]
// public List<string> NodesToRemove { get; set; }
// }
// public class Component
// {
// [YamlMember(Alias = "version")]
// public string Version { get; set; }
// [YamlMember(Alias = "name")]
// public string Name { get; set; }
// [YamlMember(Alias = "id")]
// public string Id { get; set; }
// [YamlMember(Alias = "publisher")]
// public string Publisher { get; set; }
// [YamlMember(Alias = "license")]
// public string LicensePath { get; set; }
// [YamlMember(Alias = "publisher-url")]
// public string PublisherUrl { get; set; }
// [YamlMember(Alias = "src-url")]
// public string SourceUrl { get; set; }
// [YamlMember(Alias = "summary")]
// public string Summary { get; set; }
// [YamlMember(Alias = "icons")]
// public List<string> IconsPath { get; set; }
// [YamlMember(Alias = "docs-url")]
// public string DocsUrl { get; set; }
// [YamlMember(Alias = "libraries")]
// public Libraries Libraries { get; set; }
// [YamlMember(Alias = "is_shell")]
// public bool IsShell { get; set; }
// [YamlMember(Alias = "packages")]
// public Packages Packages { get; set; }
// [YamlMember(Alias = "samples")]
// public List<Sample> Samples { get; set; }
// [YamlMember(Alias = "local-nuget-repo")]
// public string LocalNuGetRepoPath { get; set; }
// [YamlMember(Alias = "no_build")]
// public bool NoBuild { get; set; }
// [YamlMember(Alias = "additional-files")]
// public List<AdditionalFile> AdditionalFiles { get; set; }
// }
///////////////////////////////////////////////////////////
// Temporary objects with JsonProperty attribute used to //
// represent a component.yaml file due YamlDotNet bug in //
// v3.8.0 //
///////////////////////////////////////////////////////////
public abstract class PathsBase
{
[JsonProperty ("ios-unified")]
[YamlMember(Alias = "ios-unified")]
public List<string> iOSUnifiedPaths { get; set; }
[JsonProperty ("ios")]
[YamlMember(Alias = "ios")]
public List<string> iOSPaths { get; set; }
[JsonProperty ("android")]
[YamlMember(Alias = "android")]
public List<string> AndroidPaths { get; set; }
}
public class Libraries : PathsBase
{
}
public class Packages : PathsBase
{
}
public class AdditionalFile
{
[JsonProperty ("source")]
[YamlMember(Alias = "source")]
public string SourcePath { get; set; }
[JsonProperty ("destination")]
[YamlMember(Alias = "destination")]
public string DestinationPath { get; set; }
}
public class NuGetInstaller
{
[JsonProperty ("project")]
[YamlMember(Alias = "project")]
public string ProjectName { get; set; }
[JsonProperty ("packages")]
[YamlMember(Alias = "packages")]
public List<string> PackagesNames { get; set; }
}
public class Sample
{
[YamlMember(Alias = "name")]
public string Name { get; set; }
[YamlMember(Alias = "path")]
public string Path { get; set; }
[JsonProperty ("removeProjects")]
[YamlMember(Alias = "removeProjects")]
public List<string> ProjectsToRemove { get; set; }
[JsonProperty ("installNuGets")]
[YamlMember(Alias = "installNuGets")]
public List<NuGetInstaller> NuGetsToInstall { get; set; }
[JsonProperty ("removeFiles")]
[YamlMember(Alias = "removeFiles")]
public List<string> FilesToRemove { get; set; }
[JsonProperty ("removeNodes")]
[YamlMember(Alias = "removeNodes")]
public List<string> NodesToRemove { get; set; }
}
public class Component
{
[YamlMember(Alias = "version")]
public string Version { get; set; }
[YamlMember(Alias = "name")]
public string Name { get; set; }
[YamlMember(Alias = "id")]
public string Id { get; set; }
[YamlMember(Alias = "publisher")]
public string Publisher { get; set; }
[JsonProperty ("publisher-url")]
[YamlMember(Alias = "publisher-url")]
public string PublisherUrl { get; set; }
[YamlMember(Alias = "license")]
public string LicensePath { get; set; }
[JsonProperty ("src-url")]
[YamlMember(Alias = "src-url")]
public string SourceUrl { get; set; }
[YamlMember(Alias = "summary")]
public string Summary { get; set; }
[JsonProperty ("icons")]
[YamlMember(Alias = "icons")]
public List<string> IconsPath { get; set; }
[JsonProperty ("docs-url")]
[YamlMember(Alias = "docs-url")]
public string DocsUrl { get; set; }
[YamlMember(Alias = "libraries")]
public Libraries Libraries { get; set; }
[JsonProperty ("is_shell")]
[YamlMember(Alias = "is_shell")]
public bool IsShell { get; set; }
[YamlMember(Alias = "packages")]
public Packages Packages { get; set; }
[YamlMember(Alias = "samples")]
public List<Sample> Samples { get; set; }
[JsonProperty ("local-nuget-repo")]
[YamlMember(Alias = "local-nuget-repo")]
public string LocalNuGetRepoPath { get; set; }
[JsonProperty ("no_build")]
[YamlMember(Alias = "no_build")]
public bool NoBuild { get; set; }
[JsonProperty ("additional-files")]
[YamlMember(Alias = "additional-files")]
public List<AdditionalFile> AdditionalFiles { get; set; }
}