Skip to content

Commit 75b4d70

Browse files
authored
Merge pull request #146 from kichik/speedup_installation
Speed up requirements installation by skipping noDeploy
2 parents 79ba6a2 + c3114a1 commit 75b4d70

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

lib/pip.js

+19-10
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,19 @@ function installRequirements(requirementsPath, targetFolder, serverless, service
2222
fse.ensureDirSync(targetRequirementsFolder);
2323

2424
const dotSlsReqs = path.join(targetFolder, 'requirements.txt');
25-
let fileName = requirementsPath;
2625
if (options.usePipenv && fse.existsSync(path.join(servicePath, 'Pipfile'))) {
27-
fileName = dotSlsReqs;
26+
generateRequirementsFile(dotSlsReqs, dotSlsReqs, options);
27+
} else {
28+
generateRequirementsFile(requirementsPath, dotSlsReqs, options);
2829
}
2930

3031
serverless.cli.log(`Installing requirements of ${requirementsPath} in ${targetFolder}...`);
3132

32-
// In case the requirements file is a symlink, copy it to targetFolder
33-
// if using docker to avoid errors
34-
if (options.dockerizePip && fileName !== dotSlsReqs) {
35-
fse.copySync(fileName, dotSlsReqs);
36-
fileName = dotSlsReqs;
37-
}
38-
3933
let cmd;
4034
let cmdOptions;
4135
let pipCmd = [
4236
options.pythonBin, '-m', 'pip', '--isolated', 'install',
43-
'-t', targetRequirementsFolder, '-r', fileName,
37+
'-t', targetRequirementsFolder, '-r', dotSlsReqs,
4438
...options.pipCmdExtraArgs,
4539
];
4640
if (!options.dockerizePip) {
@@ -122,6 +116,21 @@ function installRequirements(requirementsPath, targetFolder, serverless, service
122116
}
123117
};
124118

119+
/**
120+
* create a filtered requirements.txt without anything from noDeploy
121+
* @param {string} source requirements
122+
* @param {string} target requirements where results are written
123+
* @param {Object} options
124+
*/
125+
function generateRequirementsFile(source, target, options) {
126+
const noDeploy = new Set(options.noDeploy || []);
127+
const requirements = fse.readFileSync(source, {encoding: 'utf-8'}).split(/\r?\n/);
128+
const filteredRequirements = requirements.filter((req) => {
129+
return !noDeploy.has(req.split(/[=<> \t]/)[0].trim());
130+
});
131+
fse.writeFileSync(target, filteredRequirements.join('\n'));
132+
}
133+
125134
/**
126135
* pip install the requirements to the .serverless/requirements directory
127136
* @return {undefined}

0 commit comments

Comments
 (0)