在生产环境中禁用 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
我遇到了 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