projen
Version:
CDK for software projects
80 lines • 8.62 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Venv = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const component_1 = require("../component");
const exec_1 = require("../util/exec");
/**
* Manages a virtual environment through the Python venv module.
*/
class Venv extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.python.Venv", version: "0.103.12" };
/**
* Name of directory to store the environment in
*/
envdir;
/**
* Path to the python executable to use.
*/
pythonExec;
constructor(project, options = {}) {
super(project);
this.envdir = options.envdir ?? ".env";
this.pythonExec = options.pythonExec ?? "python";
this.project.addGitIgnore(`/${this.envdir}`);
// VIRTUAL_ENV is set to the path of the virtual environment, which is what venv does when a virtual environment is activated.
this.project.tasks.addEnvironment("VIRTUAL_ENV", `$(python -c "import os; print('{0}/${this.envdir}'.format(os.getcwd()))")`);
// The python executable needs to be first in the PATH environment variable to make calls to the local scoped python instead of the system python.
this.project.tasks.addEnvironment("PATH", `$(python -c "import os, sys; python_dir = 'Scripts' if sys.platform == 'win32' else 'bin'; print('{0}/${this.envdir}/{1}{2}{3}'.format(os.getcwd(), python_dir, os.pathsep, os.environ['PATH']))")`);
}
/**
* Initializes the virtual environment if it doesn't exist (called during post-synthesis).
*/
setupEnvironment() {
const absoluteEnvdir = path.join(this.project.outdir, this.envdir);
if (!fs.existsSync(absoluteEnvdir)) {
this.project.logger.info("Setting up a virtual environment...");
(0, exec_1.tool)(this.pythonExec).run(["-m", "venv", this.envdir], {
cwd: this.project.outdir,
});
this.project.logger.info(`Environment successfully created (located in ./${this.envdir}).`);
}
}
}
exports.Venv = Venv;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9weXRob24vdmVudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUU3Qiw0Q0FBeUM7QUFFekMsdUNBQW9DO0FBb0JwQzs7R0FFRztBQUNILE1BQWEsSUFBSyxTQUFRLHFCQUFTOztJQUNqQzs7T0FFRztJQUNjLE1BQU0sQ0FBUztJQUVoQzs7T0FFRztJQUNjLFVBQVUsQ0FBUztJQUVwQyxZQUFZLE9BQWdCLEVBQUUsVUFBdUIsRUFBRTtRQUNyRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7UUFFakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUU3Qyw4SEFBOEg7UUFDOUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUMvQixhQUFhLEVBQ2Isc0NBQXNDLElBQUksQ0FBQyxNQUFNLDBCQUEwQixDQUM1RSxDQUFDO1FBRUYsa0pBQWtKO1FBQ2xKLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FDL0IsTUFBTSxFQUNOLHlHQUF5RyxJQUFJLENBQUMsTUFBTSxnRkFBZ0YsQ0FDck0sQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQjtRQUNyQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUEsV0FBSSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckQsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTthQUN6QixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RCLGtEQUFrRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQ2xFLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQzs7QUE5Q0gsb0JBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IElQeXRob25FbnYgfSBmcm9tIFwiLi9weXRob24tZW52XCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgdG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB2ZW52LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlbnZPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBlbnZpcm9ubWVudCBpblxuICAgKlxuICAgKiBAZGVmYXVsdCBcIi5lbnZcIlxuICAgKi9cbiAgcmVhZG9ubHkgZW52ZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZSB0byB1c2UuXG4gICAqIEBkZWZhdWx0IFwicHl0aG9uXCJcbiAgICovXG4gIHJlYWRvbmx5IHB5dGhvbkV4ZWM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTWFuYWdlcyBhIHZpcnR1YWwgZW52aXJvbm1lbnQgdGhyb3VnaCB0aGUgUHl0aG9uIHZlbnYgbW9kdWxlLlxuICovXG5leHBvcnQgY2xhc3MgVmVudiBleHRlbmRzIENvbXBvbmVudCBpbXBsZW1lbnRzIElQeXRob25FbnYge1xuICAvKipcbiAgICogTmFtZSBvZiBkaXJlY3RvcnkgdG8gc3RvcmUgdGhlIGVudmlyb25tZW50IGluXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVudmRpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZSB0byB1c2UuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHB5dGhvbkV4ZWM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBWZW52T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLmVudmRpciA9IG9wdGlvbnMuZW52ZGlyID8/IFwiLmVudlwiO1xuICAgIHRoaXMucHl0aG9uRXhlYyA9IG9wdGlvbnMucHl0aG9uRXhlYyA/PyBcInB5dGhvblwiO1xuXG4gICAgdGhpcy5wcm9qZWN0LmFkZEdpdElnbm9yZShgLyR7dGhpcy5lbnZkaXJ9YCk7XG5cbiAgICAvLyBWSVJUVUFMX0VOViBpcyBzZXQgdG8gdGhlIHBhdGggb2YgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQsIHdoaWNoIGlzIHdoYXQgdmVudiBkb2VzIHdoZW4gYSB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGFjdGl2YXRlZC5cbiAgICB0aGlzLnByb2plY3QudGFza3MuYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIlZJUlRVQUxfRU5WXCIsXG4gICAgICBgJChweXRob24gLWMgXCJpbXBvcnQgb3M7IHByaW50KCd7MH0vJHt0aGlzLmVudmRpcn0nLmZvcm1hdChvcy5nZXRjd2QoKSkpXCIpYCxcbiAgICApO1xuXG4gICAgLy8gVGhlIHB5dGhvbiBleGVjdXRhYmxlIG5lZWRzIHRvIGJlIGZpcnN0IGluIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG1ha2UgY2FsbHMgdG8gdGhlIGxvY2FsIHNjb3BlZCBweXRob24gaW5zdGVhZCBvZiB0aGUgc3lzdGVtIHB5dGhvbi5cbiAgICB0aGlzLnByb2plY3QudGFza3MuYWRkRW52aXJvbm1lbnQoXG4gICAgICBcIlBBVEhcIixcbiAgICAgIGAkKHB5dGhvbiAtYyBcImltcG9ydCBvcywgc3lzOyBweXRob25fZGlyID0gJ1NjcmlwdHMnIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGVsc2UgJ2Jpbic7IHByaW50KCd7MH0vJHt0aGlzLmVudmRpcn0vezF9ezJ9ezN9Jy5mb3JtYXQob3MuZ2V0Y3dkKCksIHB5dGhvbl9kaXIsIG9zLnBhdGhzZXAsIG9zLmVudmlyb25bJ1BBVEgnXSkpXCIpYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50IGlmIGl0IGRvZXNuJ3QgZXhpc3QgKGNhbGxlZCBkdXJpbmcgcG9zdC1zeW50aGVzaXMpLlxuICAgKi9cbiAgcHVibGljIHNldHVwRW52aXJvbm1lbnQoKSB7XG4gICAgY29uc3QgYWJzb2x1dGVFbnZkaXIgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgdGhpcy5lbnZkaXIpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhhYnNvbHV0ZUVudmRpcikpIHtcbiAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcIlNldHRpbmcgdXAgYSB2aXJ0dWFsIGVudmlyb25tZW50Li4uXCIpO1xuICAgICAgdG9vbCh0aGlzLnB5dGhvbkV4ZWMpLnJ1bihbXCItbVwiLCBcInZlbnZcIiwgdGhpcy5lbnZkaXJdLCB7XG4gICAgICAgIGN3ZDogdGhpcy5wcm9qZWN0Lm91dGRpcixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci5pbmZvKFxuICAgICAgICBgRW52aXJvbm1lbnQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgKGxvY2F0ZWQgaW4gLi8ke3RoaXMuZW52ZGlyfSkuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=