public static async Task BinderateAsync(BindingConfig config) { MavenRepository maven; if (config.MavenRepositoryType == MavenRepoType.Directory) { maven = MavenRepository.FromDirectory(config.MavenRepositoryLocation); } else if (config.MavenRepositoryType == MavenRepoType.Url) { maven = MavenRepository.FromUrl(config.MavenRepositoryLocation); } else if (config.MavenRepositoryType == MavenRepoType.MavenCentral) { maven = MavenRepository.FromMavenCentral(); } else { maven = MavenRepository.FromGoogle(); } await maven.Refresh(config.MavenArtifacts.Where(ma => !ma.DependencyOnly).Select(ma => ma.GroupId).Distinct().ToArray()); if (config.DownloadExternals) { var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir); if (!Directory.Exists(artifactDir)) { Directory.CreateDirectory(artifactDir); } } await ProcessConfig(maven, config); }
public static MavenRepository GetMavenRepository(BindingConfig config, MavenArtifactConfig artifact) { var(type, location) = GetMavenInfoForArtifact(config, artifact); var repo = GetOrCreateRepository(type, location); return(repo); }
static bool ShouldIncludeDependency(BindingConfig config, MavenArtifactConfig artifact, Dependency dependency, List <Exception> exceptions) { // We always care about 'compile' scoped dependencies if (dependency.IsCompileDependency()) { return(true); } // If we're not processing Runtime dependencies then ignore the rest if (!config.StrictRuntimeDependencies) { return(false); } // The only other thing we may care about is 'runtime', bail if this isn't 'runtime' if (!dependency.IsRuntimeDependency()) { return(false); } // Check 'artifact' list if (artifact.ExcludedRuntimeDependencies.OrEmpty().Split(',').Contains(dependency.GroupAndArtifactId(), StringComparer.OrdinalIgnoreCase)) { return(false); } // Check 'global' list if (config.ExcludedRuntimeDependencies.OrEmpty().Split(',').Contains(dependency.GroupAndArtifactId(), StringComparer.OrdinalIgnoreCase)) { return(false); } return(true); }
public static async Task Initialize(BindingConfig config) { var artifact_mavens = new List <(MavenRepository, MavenArtifactConfig)>(); foreach (var artifact in config.MavenArtifacts.Where(ma => !ma.DependencyOnly)) { var(type, location) = GetMavenInfoForArtifact(config, artifact); var repo = GetOrCreateRepository(type, location); artifact_mavens.Add((repo, artifact)); } foreach (var maven_group in artifact_mavens.GroupBy(a => a.Item1)) { var maven = maven_group.Key; var artifacts = maven_group.Select(a => a.Item2); foreach (var artifact_group in artifacts.GroupBy(a => a.GroupId)) { var gid = artifact_group.Key; var artifact_ids = artifact_group.Select(a => a.ArtifactId).ToArray(); await maven.Populate(gid, artifact_ids); } } }
public string GetOutputFile(BindingConfig config, BindingProjectModel model) { var p = OutputFileRule .Replace("{generated}", config.GeneratedDir) .Replace("{groupid}", model.MavenGroupId) .Replace("{artifactid}", model.MavenArtifacts?.FirstOrDefault()?.MavenArtifactId ?? "") .Replace("{name}", model.Name) .Replace("{nugetid}", model.NuGetPackageId); return(System.IO.Path.Combine(config.BasePath, p)); }
static (MavenRepoType type, string location) GetMavenInfoForArtifact(BindingConfig config, MavenArtifactConfig artifact) { var template = config.GetTemplateSet(artifact.TemplateSet); if (template.MavenRepositoryType.HasValue) { return(template.MavenRepositoryType.Value, template.MavenRepositoryLocation); } return(config.MavenRepositoryType, config.MavenRepositoryLocation); }
public static async Task BinderateAsync(BindingConfig config) { // Prime our Maven repositories await MavenFactory.Initialize(config); if (config.DownloadExternals) { var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir); if (!Directory.Exists(artifactDir)) { Directory.CreateDirectory(artifactDir); } } await ProcessConfig(config); }
static async Task ProcessConfig(MavenRepository maven, BindingConfig config) { var mavenProjects = new Dictionary <string, Project>(); var mavenGroups = new List <MavenGroup>(); foreach (var artifact in config.MavenArtifacts) { if (artifact.DependencyOnly) { continue; } var mavenGroup = maven.Groups.FirstOrDefault(g => g.Id == artifact.GroupId); Project project = null; project = await maven.GetProjectAsync(artifact.GroupId, artifact.ArtifactId, artifact.Version); if (project != null) { mavenProjects.Add($"{artifact.GroupId}/{artifact.ArtifactId}-{artifact.Version}", project); } } if (config.DownloadExternals) { await DownloadArtifacts(maven, config, mavenProjects); } var slnProjModels = new Dictionary <string, BindingProjectModel>(); foreach (var template in config.Templates) { var models = BuildProjectModels(config, template, mavenProjects); var json = Newtonsoft.Json.JsonConvert.SerializeObject(models); if (config.Debug.DumpModels) { File.WriteAllText(Path.Combine(config.BasePath, "models.json"), json); } var inputTemplateFile = Path.Combine(config.BasePath, template.TemplateFile); var templateSrc = File.ReadAllText(inputTemplateFile); var engine = new RazorLightEngineBuilder() .UseMemoryCachingProvider() .Build(); foreach (var model in models) { var outputFile = new FileInfo(template.GetOutputFile(config, model)); if (!outputFile.Directory.Exists) { outputFile.Directory.Create(); } string result = await engine.CompileRenderAsync(inputTemplateFile, templateSrc, model); File.WriteAllText(outputFile.FullName, result); // We want to collect all the models for the .csproj's so we can add them to a .sln file after if (!slnProjModels.ContainsKey(outputFile.FullName) && template.OutputFileRule.EndsWith(".csproj")) { slnProjModels.Add(outputFile.FullName, model); } } } if (!string.IsNullOrEmpty(config.SolutionFile)) { var slnPath = Path.Combine(config.BasePath ?? AppDomain.CurrentDomain.BaseDirectory, config.SolutionFile); var sln = SolutionFileBuilder.Build(config, slnProjModels); File.WriteAllText(slnPath, sln); } }
static List <BindingProjectModel> BuildProjectModels(BindingConfig config, TemplateConfig template, Dictionary <string, Project> mavenProjects) { var projectModels = new List <BindingProjectModel>(); var baseMetadata = new Dictionary <string, string>(); MergeValues(baseMetadata, config.Metadata); MergeValues(baseMetadata, template.Metadata); foreach (var mavenArtifact in config.MavenArtifacts) { if (mavenArtifact.DependencyOnly) { continue; } if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject)) { continue; } var artifactMetadata = new Dictionary <string, string>(); MergeValues(artifactMetadata, baseMetadata); MergeValues(artifactMetadata, mavenArtifact.Metadata); var projectModel = new BindingProjectModel { Name = mavenArtifact.ArtifactId, NuGetPackageId = mavenArtifact.NugetPackageId, NuGetVersionBase = mavenArtifact.NugetVersion, NuGetVersionSuffix = config.NugetVersionSuffix, MavenGroupId = mavenArtifact.GroupId, AssemblyName = mavenArtifact.AssemblyName, Metadata = artifactMetadata, Config = config }; projectModels.Add(projectModel); var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir, mavenArtifact.GroupId); var artifactFile = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}"); var md5File = artifactFile + ".md5"; var sha256File = artifactFile + ".sha256"; var md5 = File.Exists(md5File) ? File.ReadAllText(md5File) : string.Empty; var sha256 = File.Exists(sha256File) ? File.ReadAllText(sha256File) : string.Empty; var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId); var proguardFile = Path.Combine(artifactExtractDir, "proguard.txt"); projectModel.MavenArtifacts.Add(new MavenArtifactModel { MavenGroupId = mavenArtifact.GroupId, MavenArtifactId = mavenArtifact.ArtifactId, MavenArtifactPackaging = mavenProject.Packaging, MavenArtifactVersion = mavenArtifact.Version, MavenArtifactMd5 = md5, MavenArtifactSha256 = sha256, ProguardFile = File.Exists(proguardFile) ? GetRelativePath(proguardFile, config.BasePath).Replace("/", "\\") : null, Metadata = artifactMetadata, }); // Gather maven dependencies to try and map out nuget dependencies foreach (var mavenDep in mavenProject.Dependencies) { // We only really care about 'compile' scoped dependencies (also null/blank means compile) if (!string.IsNullOrEmpty(mavenDep.Scope) && !mavenDep.Scope.ToLowerInvariant().Equals("compile")) { continue; } mavenDep.Version = FixVersion(mavenDep.Version); var depMapping = config.MavenArtifacts.FirstOrDefault( ma => !string.IsNullOrEmpty(ma.Version) && ma.GroupId == mavenDep.GroupId && ma.ArtifactId == mavenDep.ArtifactId && mavenDep.Satisfies(ma.Version)); if (depMapping == null) { throw new Exception($"No matching artifact config found for: {mavenDep.GroupId}.{mavenDep.ArtifactId}:{mavenDep.Version} to satisfy dependency of: {mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}:{mavenArtifact.Version}"); } var dependencyMetadata = new Dictionary <string, string>(); MergeValues(dependencyMetadata, baseMetadata); MergeValues(dependencyMetadata, depMapping.Metadata); projectModel.NuGetDependencies.Add(new NuGetDependencyModel { IsProjectReference = !depMapping.DependencyOnly, NuGetPackageId = depMapping.NugetPackageId, NuGetVersionBase = depMapping.NugetVersion, NuGetVersionSuffix = config.NugetVersionSuffix, Metadata = dependencyMetadata, MavenArtifact = new MavenArtifactModel { MavenGroupId = mavenDep.GroupId, MavenArtifactId = mavenDep.ArtifactId, MavenArtifactVersion = mavenDep.Version, MavenArtifactMd5 = md5, MavenArtifactSha256 = sha256, DownloadedArtifact = artifactFile, Metadata = dependencyMetadata, } }); } } return(projectModels); }
static async Task DownloadArtifacts(MavenRepository maven, BindingConfig config, Dictionary <string, Project> mavenProjects) { var httpClient = new HttpClient(); foreach (var mavenArtifact in config.MavenArtifacts) { // Skip downloading dependencies if (mavenArtifact.DependencyOnly) { continue; } var version = mavenArtifact.Version; if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject)) { continue; } var artifactDir = Path.Combine( config.BasePath, config.ExternalsDir, mavenArtifact.GroupId); var artifactFile = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}.{mavenProject.Packaging}" : $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}"); var md5File = artifactFile + ".md5"; var sha256File = artifactFile + ".sha256"; var sourcesFile = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}-sources.jar" : $"{mavenArtifact.ArtifactId}-sources.jar"); var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId); if (!Directory.Exists(artifactDir)) { Directory.CreateDirectory(artifactDir); } if (!Directory.Exists(artifactExtractDir)) { Directory.CreateDirectory(artifactExtractDir); } var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId); // Download artifact using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging)) using (var sw = File.Create(artifactFile)) await astrm.CopyToAsync(sw); // Determine MD5 try { // First try download using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5")) using (var sw = File.Create(md5File)) await astrm.CopyToAsync(sw); } catch { // Then hash the downloaded artifact using (var file = File.OpenRead(artifactFile)) File.WriteAllText(md5File, Util.HashMd5(file)); } // Determine Sha256 try { // First try download, this almost certainly won't work // but in case Maven ever starts supporting sha256 it should start // they currently support .sha1 so there's no reason to believe the naming // convention should be any different, and one day .sha256 may exist using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".sha256")) using (var sw = File.Create(sha256File)) await astrm.CopyToAsync(sw); } catch { // Create Sha256 hash if we couldn't download using (var file = File.OpenRead(artifactFile)) File.WriteAllText(sha256File, Util.HashSha256(file)); } if (config.DownloadJavaSourceJars) { try { using (var astrm = await maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version)) using (var sw = File.Create(sourcesFile)) await astrm.CopyToAsync(sw); } catch { } } if (Directory.Exists(artifactExtractDir)) { Directory.Delete(artifactExtractDir, true); } // Unzip artifact into externals if (mavenProject.Packaging.ToLowerInvariant() == "aar") { ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir); } } }
static async Task DownloadArtifacts(MavenRepository maven, BindingConfig config, Dictionary <string, Project> mavenProjects) { var httpClient = new HttpClient(); foreach (var mavenArtifact in config.MavenArtifacts) { // Skip downloading dependencies if (mavenArtifact.DependencyOnly) { continue; } var version = mavenArtifact.Version; if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject)) { continue; } var artifactDir = Path.Combine( config.BasePath, config.ExternalsDir, mavenArtifact.GroupId); var artifactFile = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}"); var md5File = artifactFile + ".md5"; var sourcesFile = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}-sources.jar"); var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId); if (!Directory.Exists(artifactDir)) { Directory.CreateDirectory(artifactDir); } if (!Directory.Exists(artifactExtractDir)) { Directory.CreateDirectory(artifactExtractDir); } var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId); // Download artifact using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging)) using (var sw = File.Create(artifactFile)) await astrm.CopyToAsync(sw); // Determine MD5 try { // First try download using (var astrm = await mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5")) using (var sw = File.Create(md5File)) await astrm.CopyToAsync(sw); } catch { // Then hash the downloaded artifact using (var file = File.OpenRead(artifactFile)) File.WriteAllText(md5File, HashMd5(file)); } if (config.DownloadJavaSourceJars) { try { using (var astrm = await maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version)) using (var sw = File.Create(sourcesFile)) await astrm.CopyToAsync(sw); } catch { } } if (Directory.Exists(artifactExtractDir)) { Directory.Delete(artifactExtractDir, true); } // Unzip artifact into externals if (mavenProject.Packaging.ToLowerInvariant() == "aar") { ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir); } } }
static List <BindingProjectModel> BuildProjectModels(BindingConfig config, TemplateConfig template, Dictionary <string, Project> mavenProjects) { var projectModels = new List <BindingProjectModel>(); var exceptions = new List <Exception>(); var baseMetadata = new Dictionary <string, string>(); MergeValues(baseMetadata, config.Metadata); MergeValues(baseMetadata, template.Metadata); foreach (var mavenArtifact in config.MavenArtifacts) { if (mavenArtifact.DependencyOnly) { continue; } if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject)) { continue; } var artifactMetadata = new Dictionary <string, string>(); MergeValues(artifactMetadata, baseMetadata); MergeValues(artifactMetadata, mavenArtifact.Metadata); var projectModel = new BindingProjectModel { Name = mavenArtifact.ArtifactId, NuGetPackageId = mavenArtifact.NugetPackageId, NuGetVersionBase = mavenArtifact.NugetVersion, NuGetVersionSuffix = config.NugetVersionSuffix, MavenGroupId = mavenArtifact.GroupId, AssemblyName = mavenArtifact.AssemblyName, Metadata = artifactMetadata, Config = config }; projectModels.Add(projectModel); var artifactDir = Path.Combine(config.BasePath, config.ExternalsDir, mavenArtifact.GroupId); var artifactFile = Path.Combine(artifactDir, $"{mavenArtifact.ArtifactId}.{mavenProject.Packaging}"); var md5File = artifactFile + ".md5"; var sha256File = artifactFile + ".sha256"; var md5 = File.Exists(md5File) ? File.ReadAllText(md5File) : string.Empty; var sha256 = File.Exists(sha256File) ? File.ReadAllText(sha256File) : string.Empty; var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId); var proguardFile = Path.Combine(artifactExtractDir, "proguard.txt"); projectModel.MavenArtifacts.Add(new MavenArtifactModel { MavenGroupId = mavenArtifact.GroupId, MavenArtifactId = mavenArtifact.ArtifactId, MavenArtifactPackaging = mavenProject.Packaging, MavenArtifactVersion = mavenArtifact.Version, MavenArtifactMd5 = md5, MavenArtifactSha256 = sha256, ProguardFile = File.Exists(proguardFile) ? GetRelativePath(proguardFile, config.BasePath).Replace("/", "\\") : null, Metadata = artifactMetadata, }); // Gather maven dependencies to try and map out nuget dependencies foreach (var mavenDep in mavenProject.Dependencies) { if (!ShouldIncludeDependency(config, mavenArtifact, mavenDep, exceptions)) { continue; } mavenDep.Version = FixVersion(mavenDep.Version); var depMapping = config.MavenArtifacts.FirstOrDefault( ma => !string.IsNullOrEmpty(ma.Version) && ma.GroupId == mavenDep.GroupId && ma.ArtifactId == mavenDep.ArtifactId && mavenDep.Satisfies(ma.Version)); if (depMapping is null && mavenDep.IsRuntimeDependency()) { exceptions.Add(new Exception($"Artifact '{mavenArtifact.GroupAndArtifactId}' has unknown 'Runtime' dependency '{mavenDep.GroupAndArtifactId()}'. Either fulfill or exclude this dependency.")); continue; } if (depMapping == null) { StringBuilder sb = new StringBuilder(); sb.AppendLine($""); sb.AppendLine($"No matching artifact config found for: "); sb.AppendLine($" {mavenDep.GroupId}.{mavenDep.ArtifactId}:{mavenDep.Version}"); sb.AppendLine($"to satisfy dependency of: "); sb.AppendLine($" {mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}:{mavenArtifact.Version}"); sb.AppendLine($""); sb.AppendLine($" Please add following json snippet to config.json:"); sb.AppendLine($""); sb.AppendLine ($@" {{ ""groupId"": ""{mavenDep.GroupId}"", ""artifactId"": ""{mavenDep.ArtifactId}"", ""version"": ""{mavenDep.Version}"", ""nugetVersion"": ""CHECK NUGET ID"", ""nugetId"": ""CHECK PREFIX {mavenDep.Version}"", ""dependencyOnly"": true/false }} " ); sb.AppendLine($""); exceptions.Add(new Exception(sb.ToString())); continue; } var dependencyMetadata = new Dictionary <string, string>(); MergeValues(dependencyMetadata, baseMetadata); MergeValues(dependencyMetadata, depMapping.Metadata); projectModel.NuGetDependencies.Add(new NuGetDependencyModel { IsProjectReference = !depMapping.DependencyOnly, NuGetPackageId = depMapping.NugetPackageId, NuGetVersionBase = depMapping.NugetVersion, NuGetVersionSuffix = config.NugetVersionSuffix, Metadata = dependencyMetadata, MavenArtifact = new MavenArtifactModel { MavenGroupId = mavenDep.GroupId, MavenArtifactId = mavenDep.ArtifactId, MavenArtifactVersion = mavenDep.Version, MavenArtifactMd5 = md5, MavenArtifactSha256 = sha256, DownloadedArtifact = artifactFile, Metadata = dependencyMetadata, } }); } } if (exceptions.Any()) { throw new AggregateException(exceptions.ToArray()); } return(projectModels); }
public static string Build(BindingConfig config, Dictionary <string, BindingProjectModel> projects) { var csprojNamespaces = new XmlNamespaceManager(new NameTable()); csprojNamespaces.AddNamespace("ns", "http://schemas.microsoft.com/developer/msbuild/2003"); var slnFileInfo = new FileInfo(config.SolutionFile); // Collect all the projects to be added to the .sln var allProjects = new List <(string guid, string name, string key)>(); // First go through additional projects specified in the config foreach (var ap in config.AdditionalProjects) { var prjPath = Path.Combine(config.BasePath, ap); var prjPathFileInfo = new FileInfo(prjPath); if (!File.Exists(prjPath)) { throw new FileNotFoundException(prjPath); } var prjName = Path.GetFileNameWithoutExtension(prjPathFileInfo.Name); // Try and find an existing project guid in the .csproj // which might not exist if it's an SDK style project var xml = XDocument.Load(prjPath); var xelem = xml.XPathSelectElement("/ns:Project/ns:PropertyGroup/ns:ProjectGuid", csprojNamespaces); var prjGuid = xelem?.Value ?? Guid.NewGuid().ToString("B"); var prjKey = GetRelativePath(slnFileInfo.DirectoryName, prjPathFileInfo.FullName).Replace("/", "\\"); allProjects.Add((prjGuid, prjName, prjKey)); } // Add all of the generated projects foreach (var p in projects) { var groupId = p.Value.MavenGroupId; var prjName = groupId + "." + p.Value.Name; var prjKey = GetRelativePath(slnFileInfo.DirectoryName, p.Key).Replace("/", "\\"); var prjGuid = "{" + p.Value.Id + "}"; allProjects.Add((prjGuid, prjName, prjKey)); } var s = new StringBuilder(); s.AppendLine(); s.AppendLine("Microsoft Visual Studio Solution File, Format Version 12.00"); s.AppendLine("# Visual Studio 2012"); //Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "@(project.Name)", "@(project.Name)\@(project.Name).csproj", "@(project.Id)" foreach (var project in allProjects) { s.AppendLine("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"" + project.name + "\", \"" + project.key + "\", \"" + project.guid + "\""); s.AppendLine("EndProject"); } s.AppendLine("Global"); s.AppendLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); s.AppendLine("\t\tDebug|Any CPU = Debug|Any CPU"); s.AppendLine("\t\tRelease|Any CPU = Release|Any CPU"); s.AppendLine("\tEndGlobalSection"); s.AppendLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); foreach (var project in allProjects) { s.AppendLine("\t\t" + project.guid + ".Debug|Any CPU.ActiveCfg = Debug|Any CPU"); s.AppendLine("\t\t" + project.guid + ".Debug|Any CPU.Build.0 = Debug|Any CPU"); s.AppendLine("\t\t" + project.guid + ".Release|Any CPU.ActiveCfg = Release|Any CPU"); s.AppendLine("\t\t" + project.guid + ".Release|Any CPU.Build.0 = Release|Any CPU"); } s.AppendLine("\tEndGlobalSection"); s.AppendLine("EndGlobal"); return(s.ToString()); }
// Returns artifact output path static async Task <string> DownloadPayload(Artifact mvnArt, MavenArtifactConfig mavenArtifact, Project mavenProject, string artifactDir, BindingConfig config) { var package_prefix = config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}." : string.Empty; package_prefix += $"{mavenArtifact.ArtifactId}."; var base_path = Path.Combine(artifactDir, package_prefix); if (mavenProject.Packaging == "jar" || mavenProject.Packaging == "aar") { var func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging)); await TryDownloadFile(func, base_path + mavenProject.Packaging, ErrorLevel.Error); return(base_path + mavenProject.Packaging); } // Sometimes the "Packaging" isn't useful, like "bundle" for Guava or "pom" for KotlinX Coroutines. // In this case we're going to try "jar" and "aar" to try to find the real payload // Try jar var jar_func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, "jar")); var jar_result = await TryDownloadFile(jar_func, base_path + "jar", ErrorLevel.Ignore); if (jar_result) { mavenProject.Packaging = "jar"; return(base_path + "jar"); } // Try aar var aar_func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, "aar")); var aar_result = await TryDownloadFile(aar_func, base_path + "aar", ErrorLevel.Ignore); if (aar_result) { mavenProject.Packaging = "aar"; return(base_path + "aar"); } throw new Exception($"Could not find artifact payload {base_path + "jar"}. [Packaging was {mavenProject.Packaging}.]"); }
static async Task DownloadArtifacts(BindingConfig config, Dictionary <string, Project> mavenProjects) { var httpClient = new HttpClient(); foreach (var mavenArtifact in config.MavenArtifacts) { // Skip downloading dependencies if (mavenArtifact.DependencyOnly) { continue; } var maven = MavenFactory.GetMavenRepository(config, mavenArtifact); var version = mavenArtifact.Version; if (!mavenProjects.TryGetValue($"{mavenArtifact.GroupId}/{mavenArtifact.ArtifactId}-{mavenArtifact.Version}", out var mavenProject)) { continue; } var artifactDir = Path.Combine( config.BasePath, config.ExternalsDir, mavenArtifact.GroupId); var artifactExtractDir = Path.Combine(artifactDir, mavenArtifact.ArtifactId); Directory.CreateDirectory(artifactDir); Directory.CreateDirectory(artifactExtractDir); var mvnArt = maven.Groups.FirstOrDefault(g => g.Id == mavenArtifact.GroupId)?.Artifacts?.FirstOrDefault(a => a.Id == mavenArtifact.ArtifactId); // Download artifact var artifactFile = await DownloadPayload(mvnArt, mavenArtifact, mavenProject, artifactDir, config); // Determine MD5 var md5File = artifactFile + ".md5"; var md5_func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".md5")); if (!(await TryDownloadFile(md5_func, md5File, ErrorLevel.Info))) { // Then hash the downloaded artifact using (var file = File.OpenRead(artifactFile)) File.WriteAllText(md5File, Util.HashMd5(file)); } // Determine Sha256 var sha256File = artifactFile + ".sha256"; var sha_func = new Func <Task <Stream> >(() => mvnArt.OpenLibraryFile(mavenArtifact.Version, mavenProject.Packaging + ".sha256")); // First try download, this almost certainly won't work // but in case Maven ever starts supporting sha256 it should start // they currently support .sha1 so there's no reason to believe the naming // convention should be any different, and one day .sha256 may exist if (!(await TryDownloadFile(sha_func, sha256File, ErrorLevel.Ignore))) { // Create Sha256 hash if we couldn't download using (var file = File.OpenRead(artifactFile)) File.WriteAllText(sha256File, Util.HashSha256(file)); } var base_file_name = Path.Combine(artifactDir, config.DownloadExternalsWithFullName ? $"{mavenArtifact.GroupId}.{mavenArtifact.ArtifactId}" : $"{mavenArtifact.ArtifactId}"); if (config.DownloadJavaSourceJars) { var source_file = base_file_name + "-sources.jar"; var source_func = new Func <Task <Stream> >(() => maven.OpenArtifactSourcesFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version)); await TryDownloadFile(source_func, source_file, ErrorLevel.Info); } if (config.DownloadPoms) { var pom_file = base_file_name + ".pom"; var pom_func = new Func <Task <Stream> >(() => maven.OpenArtifactPomFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version)); await TryDownloadFile(pom_func, pom_file, ErrorLevel.Info); } if (config.DownloadJavaDocJars) { var javadoc_file = base_file_name + "-javadoc.jar"; var javadoc_func = new Func <Task <Stream> > (() => maven.OpenArtifactDocsFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId, version)); await TryDownloadFile(javadoc_func, javadoc_file, ErrorLevel.Info); } if (config.DownloadMetadataFiles) { var metadata_file = base_file_name + "-metadata.xml"; var metadata_func = new Func <Task <Stream> >(() => maven.OpenMavenMetadataFile(mavenArtifact.GroupId, mavenArtifact.ArtifactId)); await TryDownloadFile(metadata_func, metadata_file, ErrorLevel.Info); } if (Directory.Exists(artifactExtractDir)) { Directory.Delete(artifactExtractDir, true); } // Unzip artifact into externals if (mavenProject.Packaging.ToLowerInvariant() == "aar") { ZipFile.ExtractToDirectory(artifactFile, artifactExtractDir); } } }