diff --git a/lib/plugins/package/lib/zip-service.js b/lib/plugins/package/lib/zip-service.js index 7575f278107..4c6901ddfd7 100644 --- a/lib/plugins/package/lib/zip-service.js +++ b/lib/plugins/package/lib/zip-service.js @@ -49,7 +49,7 @@ export default { log.info('Excluding development dependencies') } - const exAndInNode = await excludeNodeDevDependenciesMemoized(serviceDir) + const exAndInNode = await excludeNodeDevDependenciesMemoized(serviceDir, this) params.exclude = _.union(params.exclude, exAndInNode.exclude) params.include = _.union(params.include, exAndInNode.include) params.devDependencyExcludeSet = new Set(exAndInNode.exclude) @@ -163,7 +163,7 @@ export default { }, } -async function excludeNodeDevDependencies(serviceDir) { +async function excludeNodeDevDependencies(serviceDir, cachedThis) { const exAndIn = { include: [], exclude: [], @@ -178,12 +178,17 @@ async function excludeNodeDevDependencies(serviceDir) { `node-dependencies-${randHash}-prod`, ) + // Adhere to excluded patterns from serverless.yml! + // If we have access issues, e.g. Docker as `root` we must exclude what the user has set to exclude + // as this is set to fail silently, we'll include all devDependencies otherwise! + // `patterns` has e.g. '!coverage/**', but globby needs '!**/coverage' so we'll transform the pattern + const globPatterns = cachedThis.serverless.service?.package?.patterns?.flatMap((pattern) => pattern?.[0] === '!' + ? pattern.replace(/^!([\w\-\/\\.]+)\/\*\*/, '!**/$1') : []) || []; + globPatterns.unshift('**/package.json') // includes must come before excludes + try { const packageJsonFilePaths = globby.sync( - [ - '**/package.json', - // TODO add glob for node_modules filtering - ], + globPatterns, { cwd: serviceDir, dot: true, @@ -346,7 +351,8 @@ async function excludeNodeDevDependencies(serviceDir) { }) ) } catch (e) { - // fail silently + console.error(`Excluding/including files/directories in packaging has failed. +Most likely reason is permission issues. Error encountered:`, e.message); return Promise.resolve(exAndIn) } }