在生产环境中禁用 sls 插件(每个阶段使用不同的插件?)

Disable sls plugin on production (different plugins per stage?)

我遇到了 serverless-offline 插件的问题。我希望它只能在本地开发(开发阶段)时访问,而不是在任何其他阶段

我的 serverless.yml 看起来像这样:

service: foo
provider:
  # ...
  stage: dev

plugins:
  - serverless-offline

custom:
  stage: "${opt:stage, self:provider.stage}"
  # ...

它工作正常(在我的本地机器上)

我试过 this solution(将插件作为自定义变量传递),但它不起作用

service: foo
provider:
  # ...
  stage: dev

custom:
  stage: "${opt:stage, self:provider.stage}"
  plugins:
    dev:
      - serverless-offline
  # ...

plugins: ${self:custom.plugins.${self:custom.stage}}

当运行 sls offline start时,它给我一个错误Serverless command "offline" not found


我已经将无服务器离线包含为 devDependencies (package.json) - 当插件包含在 serverless.yml 中时,它会在生产中出现错误 Serverless command "offline" not found

如何解决这种问题(现在我必须在部署前将其注释掉)?

https://forum.serverless.com/t/separate-plugins-for-different-environments/2043/7 说明您不能使插件动态工作。

Plugins are loaded before the serverless.yml is parsed, so you can't have dynamic variables that include or exclude plugins based on stage.

我最后写了一个小脚本来从配置文件中删除插件 属性。我们的配置是在JSON中,不是YAML,但是你可以使用yamljs包来解析和编写YAML文件。这样你就可以在你的版本控制系统中保持配置文件的完整性,并且只在构建时修改它。

它并不优雅,因为它删除了所有插件而不是特定插件,但它确实有效。如果您只需要删除特定插件,它也很容易适应。

我已将这段代码放在一个名为 remove-serverless-offline.js.

的文件中
const jsonfile = require('jsonfile');
const file = './serverless.json';
jsonfile.readFile(file, function(err, obj){

  if(!obj.hasOwnProperty('plugins')){

    console.log('serverless.json: could not find serverless-offline in plugin list.');
    return;
  }

  delete obj.plugins;

  jsonfile.writeFile(file, obj, {spaces: 4}, function(err){

    console.error(err);
  });

  console.log('serverless.json: removed serverless-offline from plugin list.')
});

在我的 package.json 下的 scripts 中,我添加了这个:

"remove-serverless-offline": "node remove-serverless-offline.js",

在 buildspec.yml 中,只需将此行添加到 pre_build 命令即可。

- npm run remove-serverless-offline