#!/bin/bash PackageDir=${1:-"."} OutputDir=${2:-""} VirtualEnvDir=${3:-""} PythonVersion=${4:-""} PipVersion=${5:-""} if [ -z "$OutputDir" ]; then echo "Usage: $0 PackageDir OutputDir VirtualEnvDir PythonVersion[3.7|3.8|3.9|3.10] PipVersionUpdate[version|false]" exit 1 fi if [ -n "$PythonVersion" ]; then if [[ ! "$PythonVersion" =~ ^3\.(7|8|9|10)$ ]]; then echo "Error: PythonVersion must be one of 3.7, 3.8, 3.9, or 3.10" exit 1 fi fi if [ -d "$OutputDir" ]; then cd "$OutputDir" OutputDir="$(pwd -P)" else cd "$(dirname "$OutputDir")" OutputDir="$(pwd -P)/$(basename "$OutputDir")" fi cd - # Go back to previous directory if [ -d "$PackageDir" ]; then cd "$PackageDir" PackageDir="$(pwd -P)" else cd "$(dirname "$PackageDir")" PackageDir="$(pwd -P)/$(basename "$PackageDir")" fi PackageName=`basename "$PackageDir"` echo Packaging contents of $PackageName from $PackageDir and writing to $OutputDir # Check if VirtualEnvDir is defined if [ -n "$VirtualEnvDir" ]; then # check if env doesn't exist if [ ! -d "$VirtualEnvDir" ]; then echo "Creating new virtual environment with python$PythonVersion" python"${PythonVersion}" -m venv "$VirtualEnvDir" || { echo "Failed to create virtual environment"; exit 1; } "$VirtualEnvDir/bin/python" -m pip install --upgrade pip || { echo "Failed to update pip"; exit 1; } fi # update pip if required if [ "$PipVersion" != "false" ]; then if [ -n "$PipVersion" ]; then "$VirtualEnvDir/bin/python" -m pip install --upgrade pip==$PipVersion || { echo "Failed to update pip"; exit 1; } else "$VirtualEnvDir/bin/python" -m pip install --upgrade pip || { echo "Failed to update pip"; exit 1; } fi fi # remove trailing slash VirtualEnvDir=${VirtualEnvDir%/} "$VirtualEnvDir/bin/python" -m pip install -r requirements.txt || { echo "Failed to install requirements"; exit 1; } # Build in virtual env cp ${PackageName} __main__.py VersionString=$($VirtualEnvDir/bin/python ./${PackageName} --version 2>&1 >/dev/null) echo 'def Get(): return "'$VersionString'"' > version.py find . | egrep "\.(py|PY|yaml)$" | zip -@ "$OutputDir/$PackageName.zip" cat <(echo "#!/usr/bin/env $VirtualEnvDir/bin/python") "$OutputDir/$PackageName.zip" > "$OutputDir/$PackageName" else # Build in main env cp ${PackageName} __main__.py VersionString=$(/usr/local/bin/python ./${PackageName} --version 2>&1 >/dev/null) echo 'def Get(): return "'$VersionString'"' > version.py find . | egrep "\.(py|PY|yaml)$" | zip -@ "$OutputDir/$PackageName.zip" cat <(echo "#!/usr/bin/env /usr/local/bin/python") "$OutputDir/$PackageName.zip" > "$OutputDir/$PackageName" fi chmod 777 "$OutputDir/$PackageName" rm "$OutputDir/$PackageName.zip" rm __main__.py