in src/startupscriptgenerator/src/python/scriptgenerator.go [151:235]
func (gen *PythonStartupScriptGenerator) getPackageSetupCommand() string {
scriptBuilder := strings.Builder{}
// Values in manifest file takes precedence over values supplied at command line
virtualEnvironmentName := gen.Manifest.VirtualEnvName
if virtualEnvironmentName == "" {
virtualEnvironmentName = gen.VirtualEnvName
}
packageDirName := gen.Manifest.PackageDir
if packageDirName == "" {
packageDirName = gen.PackageDirectory
}
if virtualEnvironmentName != "" {
virtualEnvDir := filepath.Join(gen.getAppPath(), virtualEnvironmentName)
scriptBuilder.WriteString(
fmt.Sprintf("echo 'export VIRTUALENVIRONMENT_PATH=\"%s\"' >> ~/.bashrc\n", virtualEnvDir))
scriptBuilder.WriteString(fmt.Sprintf("echo '. %s/bin/activate' >> ~/.bashrc\n", virtualEnvironmentName))
// If virtual environment was not compressed or if it is compressed but mounted using a zip driver,
// we do not want to extract the compressed file
if gen.Manifest.CompressedVirtualEnvFile == "" || gen.SkipVirtualEnvExtraction {
if common.PathExists(virtualEnvDir) {
// We add the virtual env site-packages to PYTHONPATH instead of activating it to be backwards compatible with existing
// app service implementation. If we activate the virtual env directly things don't work since it has hardcoded references to
// python libraries including the absolute path. Since Python is installed in different paths in build and runtime images,
// the libraries are not found.
venvSubScript := gen.getVenvHandlingScript(virtualEnvironmentName, virtualEnvDir)
scriptBuilder.WriteString(venvSubScript)
} else {
packageDirName = "__oryx_packages__"
// We just warn the user and don't error out, since we still can run the default website.
scriptBuilder.WriteString(" echo WARNING: Could not find virtual environment directory '" + virtualEnvDir + "'.\n")
}
} else {
compressedFile := gen.Manifest.CompressedVirtualEnvFile
virtualEnvDir := "/" + virtualEnvironmentName
if strings.HasSuffix(compressedFile, ".zip") {
scriptBuilder.WriteString("echo Found virtual environment .zip archive.\n")
scriptBuilder.WriteString(
"extractionCommand=\"unzip -q " + compressedFile + " -d " + virtualEnvDir + "\"\n")
} else if strings.HasSuffix(compressedFile, ".tar.gz") {
scriptBuilder.WriteString("echo Found virtual environment .tar.gz archive.\n")
scriptBuilder.WriteString(
"extractionCommand=\"tar -xzf " + compressedFile + " -C " + virtualEnvDir + "\"\n")
} else {
fmt.Printf(
"Error: Unrecognizable file '%s'. Expected a file with a '.zip' or '.tar.gz' extension.\n",
compressedFile)
os.Exit(consts.FAILURE_EXIT_CODE)
}
scriptBuilder.WriteString(
"echo Removing existing virtual environment directory '" + virtualEnvDir + "'...\n")
scriptBuilder.WriteString("rm -fr " + virtualEnvDir + "\n")
scriptBuilder.WriteString("mkdir -p " + virtualEnvDir + "\n")
scriptBuilder.WriteString("echo Extracting to directory '" + virtualEnvDir + "'...\n")
scriptBuilder.WriteString("$extractionCommand\n")
venvSubScript := gen.getVenvHandlingScript(virtualEnvironmentName, virtualEnvDir)
scriptBuilder.WriteString(venvSubScript)
}
}
if packageDirName != "" {
packageDir := filepath.Join(gen.getAppPath(), packageDirName)
if common.PathExists(packageDir) {
scriptBuilder.WriteString("echo Using package directory '" + packageDir + "'\n")
scriptBuilder.WriteString("SITE_PACKAGE_PYTHON_VERSION=$(python -c \"import sys; print(str(sys.version_info.major) + '.' + str(sys.version_info.minor))\")\n")
scriptBuilder.WriteString("SITE_PACKAGES_PATH=$HOME\"/.local/lib/python\"$SITE_PACKAGE_PYTHON_VERSION\"/site-packages\"\n")
scriptBuilder.WriteString("mkdir -p $SITE_PACKAGES_PATH\n")
scriptBuilder.WriteString("echo \"" + packageDir + "\" > $SITE_PACKAGES_PATH\"/oryx.pth\"\n")
scriptBuilder.WriteString("PATH=\"" + packageDir + "/bin:$PATH\"\n")
scriptBuilder.WriteString("echo \"Updated PATH to '$PATH'\"\n")
} else {
// We just warn the user and don't error out, since we still can run the default website.
scriptBuilder.WriteString(" echo WARNING: Could not find package directory '" + packageDir + "'.\n")
}
}
return scriptBuilder.String()
}