in src/WebJobs.Script/Host/HostFunctionMetadataProvider.cs [218:273]
internal static string DeterminePrimaryScriptFile(string scriptFile, string scriptDirectory, IFileSystem fileSystem = null)
{
fileSystem ??= FileUtility.Instance;
// First see if there is an explicit primary file indicated
// in config. If so use that.
string functionPrimary = null;
if (!string.IsNullOrEmpty(scriptFile))
{
string scriptPath = fileSystem.Path.Combine(scriptDirectory, scriptFile);
if (!fileSystem.File.Exists(scriptPath))
{
throw new FunctionConfigurationException("Invalid script file name configuration. The 'scriptFile' property is set to a file that does not exist.");
}
functionPrimary = scriptPath;
}
else
{
string[] functionFiles = fileSystem.Directory.EnumerateFiles(scriptDirectory)
.Where(p => fileSystem.Path.GetFileName(p).ToLowerInvariant() != ScriptConstants.FunctionMetadataFileName)
.ToArray();
if (functionFiles.Length == 0)
{
return null;
}
if (functionFiles.Length == 1)
{
// if there is only a single file, that file is primary
functionPrimary = functionFiles[0];
}
else
{
// if there is a "run" file, that file is primary,
// for Node, any index.js file is primary
// for Python, __init__.py file is primary
// TODO #6955: Get default function file name from language worker configs
functionPrimary = functionFiles.FirstOrDefault(p =>
fileSystem.Path.GetFileNameWithoutExtension(p).ToLowerInvariant() == "run" ||
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.js" ||
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.mjs" ||
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "index.cjs" ||
fileSystem.Path.GetFileName(p).ToLowerInvariant() == "__init__.py");
}
}
// Primary script file is not required for HttpWorker or any custom language worker
if (string.IsNullOrEmpty(functionPrimary))
{
return null;
}
return Path.GetFullPath(functionPrimary);
}