/// <summary> /// Builds the plugin and returns the name of the jar that was created /// </summary> private string BuildPlugin(RoslynPluginDefinition definition, string outputDirectory) { logger.LogInfo(UIResources.APG_GeneratingPlugin); // Make the .jar name match the format [artefactid]-[version].jar // i.e. the format expected by Maven Directory.CreateDirectory(outputDirectory); string fullJarPath = Path.Combine(outputDirectory, definition.Manifest.Key + "-plugin-" + definition.Manifest.Version + ".jar"); string repositoryId = RepositoryKeyUtilities.GetValidKey(definition.PackageId + "." + definition.Language); string repoKey = RepositoryKeyPrefix + repositoryId; RoslynPluginJarBuilder builder = new RoslynPluginJarBuilder(logger); builder.SetLanguage(definition.Language) .SetRepositoryKey(repoKey) .SetRepositoryName(definition.Manifest.Name) .SetRulesFilePath(definition.RulesFilePath) .SetPluginManifestProperties(definition.Manifest) .SetJarFilePath(fullJarPath); AddRoslynMetadata(builder, definition, repositoryId); string relativeStaticFilePath = "static/" + Path.GetFileName(definition.StaticResourceName); builder.AddResourceFile(definition.SourceZipFilePath, relativeStaticFilePath); builder.Build(); return(fullJarPath); }
private void AddRoslynMetadata(RoslynPluginJarBuilder builder, RoslynPluginDefinition definition, string repositoryId) { builder.SetPluginProperty(repositoryId + ".nuget.packageId", definition.PackageId); builder.SetPluginProperty(repositoryId + ".nuget.packageVersion", definition.PackageVersion); builder.SetPluginProperty(repositoryId + ".analyzerId", definition.PackageId); builder.SetPluginProperty(repositoryId + ".ruleNamespace", definition.PackageId); builder.SetPluginProperty(repositoryId + ".staticResourceName", definition.StaticResourceName); builder.SetPluginProperty(repositoryId + ".pluginKey", definition.Manifest.Key); builder.SetPluginProperty(repositoryId + ".pluginVersion", definition.Manifest.Version); }
private string GeneratePluginForPackage(string outputDir, string language, string rulesFilePath, IPackage package, IEnumerable <DiagnosticAnalyzer> analyzers) { Debug.Assert(analyzers.Any(), "The method must be called with a populated list of DiagnosticAnalyzers."); logger.LogInfo(UIResources.APG_AnalyzersLocated, package.Id, analyzers.Count()); string createdJarFilePath = null; string baseDirectory = CreateBaseWorkingDirectory(); // Collect the remaining data required to build the plugin RoslynPluginDefinition definition = new RoslynPluginDefinition { Language = language, RulesFilePath = rulesFilePath, PackageId = package.Id, PackageVersion = package.Version.ToString(), Manifest = CreatePluginManifest(package) }; // Create a zip containing the required analyzer files string packageDir = packageHandler.GetLocalPackageRootDirectory(package); definition.SourceZipFilePath = CreateAnalyzerStaticPayloadFile(packageDir, baseDirectory); definition.StaticResourceName = Path.GetFileName(definition.SourceZipFilePath); bool generate = true; string generatedRulesTemplateFile = null; if (definition.RulesFilePath == null) { definition.RulesFilePath = GenerateRulesFile(analyzers, baseDirectory); generatedRulesTemplateFile = CalculateRulesTemplateFileName(package, outputDir); File.Copy(definition.RulesFilePath, generatedRulesTemplateFile, overwrite: true); } else { this.logger.LogInfo(UIResources.APG_UsingSuppliedRulesFile, definition.RulesFilePath); generate = IsValidRulesFile(definition.RulesFilePath); } if (generate) { createdJarFilePath = BuildPlugin(definition, outputDir); } LogMessageForGeneratedRules(generatedRulesTemplateFile); return(createdJarFilePath); }
private string GeneratePluginForPackage(string outputDir, string language, string sqaleFilePath, IPackage package, IEnumerable<DiagnosticAnalyzer> analyzers) { Debug.Assert(analyzers.Any(), "The method must be called with a populated list of DiagnosticAnalyzers."); this.logger.LogInfo(UIResources.APG_AnalyzersLocated, package.Id, analyzers.Count()); string createdJarFilePath = null; string baseDirectory = CreateBaseWorkingDirectory(); // Collect the remaining data required to build the plugin RoslynPluginDefinition definition = new RoslynPluginDefinition(); definition.Language = language; definition.SqaleFilePath = sqaleFilePath; definition.PackageId = package.Id; definition.PackageVersion = package.Version.ToString(); definition.Manifest = CreatePluginManifest(package); // Create a zip containing the required analyzer files string packageDir = this.packageHandler.GetLocalPackageRootDirectory(package); definition.SourceZipFilePath = this.CreateAnalyzerStaticPayloadFile(packageDir, baseDirectory); definition.StaticResourceName = Path.GetFileName(definition.SourceZipFilePath); definition.RulesFilePath = GenerateRulesFile(analyzers, baseDirectory); string generatedSqaleFile = null; bool generate = true; if (definition.SqaleFilePath == null) { generatedSqaleFile = CalculateSqaleFileName(package, outputDir); GenerateFixedSqaleFile(analyzers, generatedSqaleFile); Debug.Assert(File.Exists(generatedSqaleFile)); } else { generate = IsValidSqaleFile(definition.SqaleFilePath); } if (generate) { createdJarFilePath = BuildPlugin(definition, outputDir); } LogMessageForGeneratedSqale(generatedSqaleFile); return createdJarFilePath; }
/// <summary> /// Builds the plugin and returns the name of the jar that was created /// </summary> private string BuildPlugin(RoslynPluginDefinition definition, string outputDirectory) { this.logger.LogInfo(UIResources.APG_GeneratingPlugin); // Make the .jar name match the format [artefactid]-[version].jar // i.e. the format expected by Maven Directory.CreateDirectory(outputDirectory); string fullJarPath = Path.Combine(outputDirectory, definition.Manifest.Key + "-plugin-" + definition.Manifest.Version + ".jar"); string repositoryId = RepositoryKeyUtilities.GetValidKey(definition.PackageId + "." + definition.Language); string repoKey = RepositoryKeyPrefix + repositoryId; RoslynPluginJarBuilder builder = new RoslynPluginJarBuilder(logger); builder.SetLanguage(definition.Language) .SetRepositoryKey(repoKey) .SetRepositoryName(definition.Manifest.Name) .SetRulesFilePath(definition.RulesFilePath) .SetPluginManifestProperties(definition.Manifest) .SetJarFilePath(fullJarPath); if (!string.IsNullOrWhiteSpace(definition.SqaleFilePath)) { builder.SetSqaleFilePath(definition.SqaleFilePath); } AddRoslynMetadata(builder, definition, repositoryId); string relativeStaticFilePath = "static/" + Path.GetFileName(definition.StaticResourceName); builder.AddResourceFile(definition.SourceZipFilePath, relativeStaticFilePath); builder.Build(); return fullJarPath; }
public bool Generate(ProcessedArgs args) { if (args == null) { throw new ArgumentNullException("args"); } IPackage package = this.packageHandler.FetchPackage(args.PackageId, args.PackageVersion); if (package == null) { return false; } string packageDir = this.packageHandler.GetLocalPackageRootDirectory(package); IEnumerable<DiagnosticAnalyzer> analyzers = GetAnalyzers(packageDir, this.packageHandler.LocalCacheRoot, args.Language); if (!analyzers.Any()) { return false; } IEnumerable<IPackage> licenseAcceptancePackages = this.GetPackagesRequiringLicenseAcceptance(package); if (licenseAcceptancePackages.Any() && ! args.AcceptLicenses) { this.logger.LogError(UIResources.APG_NGPackageRequiresLicenseAcceptance, package.Id, package.Version.ToString()); this.ListPackagesRequiringLicenseAcceptance(licenseAcceptancePackages); return false; } string createdJarFilePath = null; string baseDirectory = CreateBaseWorkingDirectory(); // Collect the remaining data required to build the plugin RoslynPluginDefinition definition = new RoslynPluginDefinition(); definition.Language = args.Language; definition.SqaleFilePath = args.SqaleFilePath; definition.PackageId = package.Id; definition.PackageVersion = package.Version.ToString(); definition.Manifest = CreatePluginManifest(package); // Create a zip containing the required analyzer files definition.SourceZipFilePath = this.CreateAnalyzerStaticPayloadFile(packageDir, baseDirectory); definition.StaticResourceName = Path.GetFileName(definition.SourceZipFilePath); definition.RulesFilePath = GenerateRulesFile(analyzers, baseDirectory); string generatedSqaleFile = null; bool generate = true; if (definition.SqaleFilePath == null) { generatedSqaleFile = CalculateSqaleFileName(package, args.OutputDirectory); GenerateFixedSqaleFile(analyzers, generatedSqaleFile); Debug.Assert(File.Exists(generatedSqaleFile)); } else { generate = IsValidSqaleFile(definition.SqaleFilePath); } if (generate) { createdJarFilePath = BuildPlugin(definition, args.OutputDirectory); } LogSummary(createdJarFilePath, generatedSqaleFile, licenseAcceptancePackages); return createdJarFilePath != null; }