Skip to content

File variable resolution happens before properties it depends on are resolved #7895

@walery

Description

@walery

Our serverless.yml file has dynamic service name. It looks like this:

service: ${self:custom.product}-${self:custom.component}

custom:
  product: foo
  component: backend

We can request the name of stack inside of ${file(foo.js):bar} call with:

module.exports.bar = (serverless) => {
  serverless.providers.aws.naming.getStackName();
  // ...
};

Result of serverless.providers.aws.naming.getStackName() is wrong:

actual ${self:custom.product}-${self:custom.component}-dev
expected foo-backend-dev

I guess that this is timing problem, so that jump to function happens before service variable is resolved.

serverless.yml
service: ${self:custom.product}-${self:custom.component}

provider:
  name: aws

custom:
  product: foo
  component: backend

resources:
  - Outputs:
      Foo:
        Value: ${file(foo.js):bar}
foo.js
module.exports.bar = (serverless) => {
  serverless.cli.consoleLog('');
  serverless.cli.consoleLog(serverless.providers.aws.naming.getStackName());
  serverless.cli.consoleLog('');

  return 'just dummy...';
};
sls print output
Serverless: Load command interactiveCli
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command config:tabcompletion
Serverless: Load command config:tabcompletion:install
Serverless: Load command config:tabcompletion:uninstall
Serverless: Load command create
Serverless: Load command install
Serverless: Load command package
Serverless: Load command deploy
Serverless: Load command deploy:function
Serverless: Load command deploy:list
Serverless: Load command deploy:list:functions
Serverless: Load command invoke
Serverless: Load command invoke:local
Serverless: Load command info
Serverless: Load command logs
Serverless: Load command metrics
Serverless: Load command print
Serverless: Load command remove
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command slstats
Serverless: Load command plugin
Serverless: Load command plugin
Serverless: Load command plugin:install
Serverless: Load command plugin
Serverless: Load command plugin:uninstall
Serverless: Load command plugin
Serverless: Load command plugin:list
Serverless: Load command plugin
Serverless: Load command plugin:search
Serverless: Load command config
Serverless: Load command config:credentials
Serverless: Load command rollback
Serverless: Load command rollback:function
Serverless: Load command upgrade
Serverless: Load command uninstall
Serverless: Load command login
Serverless: Load command logout
Serverless: Load command generate-event
Serverless: Load command test
Serverless: Load command dashboard
Serverless: Load command output
Serverless: Load command output:get
Serverless: Load command output:list
Serverless: Load command param
Serverless: Load command param:get
Serverless: Load command param:list
Serverless: Load command studio
Serverless: Load command dev

${self:custom.product}-${self:custom.component}-dev

service: foo-backend
provider:
  name: aws
custom:
  product: foo
  component: backend
resources:
  - Outputs:
      Foo:
        Value: just dummy...

Installed version

Framework Core: 1.74.1
Plugin: 3.6.15
SDK: 2.3.1
Components: 2.31.9

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions