/// <summary> /// Builds the full build script from the list of snippets for each platform. /// </summary> /// <returns>Finalized build script as a string.</returns> private string BuildScriptFromSnippets( BuildScriptGeneratorContext context, string installationScript, IList <BuildScriptSnippet> buildScriptSnippets, IDictionary <string, string> toolsToVersion, List <string> directoriesToExcludeFromCopyToIntermediateDir, List <string> directoriesToExcludeFromCopyToBuildOutputDir, IEnumerable <PlatformDetectorResult> detectionResults) { string script; string benvArgs = StringExtensions.JoinKeyValuePairs(toolsToVersion); benvArgs = $"{benvArgs} {Constants.BenvDynamicInstallRootDirKey}=\"{_cliOptions.DynamicInstallRootDir}\""; Dictionary <string, string> buildProperties = buildScriptSnippets .Where(s => s.BuildProperties != null) .SelectMany(s => s.BuildProperties) .ToDictionary(p => p.Key, p => p.Value); buildProperties[ManifestFilePropertyKeys.OperationId] = context.OperationId; var allPlatformNames = detectionResults .Where(s => s.Platform != null) .Select(s => s.Platform) .ToList(); foreach (var eachPlatformName in allPlatformNames) { _logger.LogInformation($"Build Property Key:{ManifestFilePropertyKeys.PlatformName} value: {eachPlatformName} is written into manifest"); if (buildProperties.ContainsKey(ManifestFilePropertyKeys.PlatformName)) { buildProperties[ManifestFilePropertyKeys.PlatformName] = string.Join( buildProperties[ManifestFilePropertyKeys.PlatformName], ",", eachPlatformName); } else { buildProperties[ManifestFilePropertyKeys.PlatformName] = eachPlatformName; } } (var preBuildCommand, var postBuildCommand) = PreAndPostBuildCommandHelper.GetPreAndPostBuildCommands( context.SourceRepo, _cliOptions); var outputIsSubDirOfSourceDir = false; if (!string.IsNullOrEmpty(_cliOptions.DestinationDir)) { outputIsSubDirOfSourceDir = DirectoryHelper.IsSubDirectory( _cliOptions.DestinationDir, _cliOptions.SourceDir); } // Copy the source content to destination only if all the platforms involved in generating the build script // say yes. var copySourceDirectoryContentToDestinationDirectory = buildScriptSnippets.All( snippet => snippet.CopySourceDirectoryContentToDestinationDirectory); if (!string.IsNullOrEmpty(_cliOptions.AppType) && !string.IsNullOrWhiteSpace(_cliOptions.AppType)) { _logger.LogInformation($"Build Property Key {Constants.AppType} with value {_cliOptions.AppType} is written into manifest"); buildProperties[Constants.AppType] = _cliOptions.AppType; } var buildScriptProps = new BaseBashBuildScriptProperties() { OsPackagesToInstall = _cliOptions.RequiredOsPackages ?? new string[0], BuildScriptSnippets = buildScriptSnippets.Select(s => s.BashBuildScriptSnippet), BenvArgs = benvArgs, PreBuildCommand = preBuildCommand, PostBuildCommand = postBuildCommand, DirectoriesToExcludeFromCopyToIntermediateDir = directoriesToExcludeFromCopyToIntermediateDir, DirectoriesToExcludeFromCopyToBuildOutputDir = directoriesToExcludeFromCopyToBuildOutputDir, ManifestFileName = FilePaths.BuildManifestFileName, ManifestDir = context.ManifestDir, BuildProperties = buildProperties, BenvPath = FilePaths.Benv, PlatformInstallationScript = installationScript, OutputDirectoryIsNested = outputIsSubDirOfSourceDir, CopySourceDirectoryContentToDestinationDirectory = copySourceDirectoryContentToDestinationDirectory, }; LogScriptIfGiven("pre-build", buildScriptProps.PreBuildCommand); LogScriptIfGiven("post-build", buildScriptProps.PostBuildCommand); script = TemplateHelper.Render( TemplateHelper.TemplateResource.BaseBashScript, buildScriptProps, _logger); return(script); }
/// <summary> /// Builds the full build script from the list of snippets for each platform. /// </summary> /// <returns>Finalized build script as a string.</returns> private string BuildScriptFromSnippets( BuildScriptGeneratorContext context, IList <BuildScriptSnippet> snippets, IDictionary <string, string> toolsToVersion, List <string> directoriesToExcludeFromCopyToIntermediateDir, List <string> directoriesToExcludeFromCopyToBuildOutputDir) { string script; string benvArgs = StringExtensions.JoinKeyValuePairs(toolsToVersion); Dictionary <string, string> buildProperties = snippets .Where(s => s.BuildProperties != null) .SelectMany(s => s.BuildProperties) .ToDictionary(p => p.Key, p => p.Value); buildProperties[ManifestFilePropertyKeys.OperationId] = context.OperationId; (var preBuildCommand, var postBuildCommand) = PreAndPostBuildCommandHelper.GetPreAndPostBuildCommands( context.SourceRepo, _cliOptions); var outputIsSubDirOfSourceDir = false; if (!string.IsNullOrEmpty(_cliOptions.DestinationDir)) { outputIsSubDirOfSourceDir = DirectoryHelper.IsSubDirectory( _cliOptions.DestinationDir, _cliOptions.SourceDir); } // Copy the source content to destination only if all the platforms involved in generating the build script // say yes. var copySourceDirectoryContentToDestinationDirectory = snippets.All( snippet => snippet.CopySourceDirectoryContentToDestinationDirectory); var buildScriptProps = new BaseBashBuildScriptProperties() { OsPackagesToInstall = _cliOptions.RequiredOsPackages ?? new string[0], BuildScriptSnippets = snippets.Select(s => s.BashBuildScriptSnippet), BenvArgs = benvArgs, PreBuildCommand = preBuildCommand, PostBuildCommand = postBuildCommand, DirectoriesToExcludeFromCopyToIntermediateDir = directoriesToExcludeFromCopyToIntermediateDir, DirectoriesToExcludeFromCopyToBuildOutputDir = directoriesToExcludeFromCopyToBuildOutputDir, ManifestFileName = FilePaths.BuildManifestFileName, ManifestDir = context.ManifestDir, BuildProperties = buildProperties, BenvPath = FilePaths.Benv, PlatformInstallationScriptSnippets = snippets.Select(s => s.PlatformInstallationScriptSnippet), OutputDirectoryIsNested = outputIsSubDirOfSourceDir, CopySourceDirectoryContentToDestinationDirectory = copySourceDirectoryContentToDestinationDirectory, }; LogScriptIfGiven("pre-build", buildScriptProps.PreBuildCommand); LogScriptIfGiven("post-build", buildScriptProps.PostBuildCommand); script = TemplateHelper.Render( TemplateHelper.TemplateResource.BaseBashScript, buildScriptProps, _logger); return(script); }