From 0f6faf6a9bf9529602aba6f0dc78b72626551799 Mon Sep 17 00:00:00 2001 From: QAnders Date: Wed, 25 Jun 2025 17:34:06 +0200 Subject: [PATCH 1/3] Adhere to Serverless.yml exckude list --- lib/plugins/package/lib/zip-service.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/plugins/package/lib/zip-service.js b/lib/plugins/package/lib/zip-service.js index 7575f278107..bcb1e16b2bd 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, From 95a861a8f909d0ba4e13ae59de6f36b63c76164d Mon Sep 17 00:00:00 2001 From: QAnders Date: Wed, 25 Jun 2025 17:53:45 +0200 Subject: [PATCH 2/3] Fixing optional chainig --- lib/plugins/package/lib/zip-service.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/plugins/package/lib/zip-service.js b/lib/plugins/package/lib/zip-service.js index bcb1e16b2bd..00e0a04f37a 100644 --- a/lib/plugins/package/lib/zip-service.js +++ b/lib/plugins/package/lib/zip-service.js @@ -178,12 +178,12 @@ async function excludeNodeDevDependencies(serviceDir, cachedThis) { `node-dependencies-${randHash}-prod`, ) - // Adhere to excluded patterns from serverless.yml + // 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') : []) + 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 { From 82d2f1173818633231f675f07703a7b2a9f07286 Mon Sep 17 00:00:00 2001 From: QAnders Date: Thu, 26 Jun 2025 06:46:31 +0200 Subject: [PATCH 3/3] Adding log for failed packaging --- lib/plugins/package/lib/zip-service.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/plugins/package/lib/zip-service.js b/lib/plugins/package/lib/zip-service.js index 00e0a04f37a..4c6901ddfd7 100644 --- a/lib/plugins/package/lib/zip-service.js +++ b/lib/plugins/package/lib/zip-service.js @@ -351,7 +351,8 @@ async function excludeNodeDevDependencies(serviceDir, cachedThis) { }) ) } 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) } }