in src/BuildScriptGenerator/DefaultBuildScriptGenerator.cs [53:160]
public void GenerateBashScript(
BuildScriptGeneratorContext context,
out string script,
List<ICheckerMessage> checkerMessageSink = null)
{
script = null;
IList<BuildScriptSnippet> buildScriptSnippets;
var directoriesToExcludeFromCopyToIntermediateDir = new List<string>();
var directoriesToExcludeFromCopyToBuildOutputDir = new List<string>();
// Try detecting ALL platforms since in some scenarios this is required.
// For example, in case of a multi-platform app like ASP.NET Core + NodeJs, we might need to dynamically
// install both these platforms' sdks before actually using any of their commands. So even though a user
// of Oryx might explicitly supply the platform of the app as .NET Core, we still need to make sure the
// build environment is setup with detected platforms' sdks.
var platformInfos = _platformsInformationProvider.GetPlatformsInfo(context);
var detectionResults = platformInfos.Select(pi => pi.DetectorResult);
var installationScript = _environmentSetupScriptProvider.GetBashScriptSnippet(
context,
detectionResults);
// Get list of tools to be set on benv
var toolsToVersion = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var toolsToBeSetInPath in platformInfos
.Where(pi => pi.RequiredToolsInPath != null)
.Select(pi => pi.RequiredToolsInPath))
{
foreach (var toolNameAndVersion in toolsToBeSetInPath)
{
if (!string.IsNullOrEmpty(
Environment.GetEnvironmentVariable(toolNameAndVersion.Key)))
{
_logger.LogInformation($"If {toolNameAndVersion.Key} is set as environment, it'll be not be set via benv");
}
else
{
_logger.LogInformation($"If {toolNameAndVersion.Key} is not set as environment, it'll be set to {toolNameAndVersion.Value} via benv");
toolsToVersion[toolNameAndVersion.Key] = toolNameAndVersion.Value;
}
}
}
using (var timedEvent = _logger.LogTimedEvent("GetBuildSnippets"))
{
buildScriptSnippets = GetBuildSnippets(
context,
detectionResults,
runDetection: false,
directoriesToExcludeFromCopyToIntermediateDir,
directoriesToExcludeFromCopyToBuildOutputDir);
timedEvent.SetProperties(toolsToVersion);
}
if (_checkers != null && checkerMessageSink != null && _cliOptions.EnableCheckers)
{
try
{
_logger.LogDebug("Running checkers");
RunCheckers(context, toolsToVersion, checkerMessageSink);
}
catch (Exception exc)
{
_logger.LogError(exc, "Exception caught while running checkers");
}
}
else
{
_logger.LogInformation("Not running checkers - condition evaluates to " +
"({checkersNotNull} && {sinkNotNull} && {enableCheckers})",
_checkers != null, checkerMessageSink != null, _cliOptions.EnableCheckers);
}
if (buildScriptSnippets != null)
{
foreach (var snippet in buildScriptSnippets)
{
if (snippet.IsFullScript)
{
script = snippet.BashBuildScriptSnippet;
return;
}
}
}
if (buildScriptSnippets.Any())
{
// By default exclude these irrespective of platform
directoriesToExcludeFromCopyToIntermediateDir.Add(".git");
directoriesToExcludeFromCopyToBuildOutputDir.Add(".git");
script = BuildScriptFromSnippets(
context,
installationScript,
buildScriptSnippets,
new ReadOnlyDictionary<string, string>(toolsToVersion),
directoriesToExcludeFromCopyToIntermediateDir,
directoriesToExcludeFromCopyToBuildOutputDir,
detectionResults);
}
else
{
// TODO: Should an UnsupportedPlatformException be thrown here?
// Seeing as the issue was that platforms were IDENTIFIED, but no build snippets were emitted from them
throw new UnsupportedPlatformException(Labels.UnableToDetectPlatformMessage);
}
}