package.json中config变量生效异常:exclude参数无法正常排除文件
问题原因及解决方案
失效原因
npm在将package.json的config变量注入脚本时,会把copy_exclude的完整值作为单个字符串参数传递给tar命令,而非拆分成两个独立的--exclude选项。
实际执行npm run tar:config时,传递给tar的参数是:
tar "--exclude='node_modules' --exclude='.DS_Store'" -pzcf example_config.tar.gz some-folder
tar只会把这个长字符串当作一个无效选项处理,无法解析内部的两个排除规则,因此排除逻辑失效。而tar:hardcoded脚本里的--exclude是直接写在命令中的,shell会自动将其拆分为两个独立参数,所以能正常生效。
修复方案
方案1:拆分config变量
将每个--exclude规则单独设为一个config变量,在脚本中分别引用:
{ "name": "tar", "version": "1.0.0", "config": { "local_dir": "/path/to/some/directory", "copy_dir": "some-folder", "exclude1": "--exclude='node_modules'", "exclude2": "--exclude='.DS_Store'" }, "scripts": { "tar:config": "cd $npm_package_config_local_dir && tar $npm_package_config_exclude1 $npm_package_config_exclude2 -pzcf example_config.tar.gz $npm_package_config_copy_dir" } }
方案2:用shell的eval解析参数
通过eval让shell重新解析命令字符串,将复合参数拆分为独立选项:
{ "name": "tar", "version": "1.0.0", "config": { "local_dir": "/path/to/some/directory", "copy_dir": "some-folder", "copy_exclude": "--exclude='node_modules' --exclude='.DS_Store'" }, "scripts": { "tar:config": "cd $npm_package_config_local_dir && eval tar $npm_package_config_copy_exclude -pzcf example_config.tar.gz $npm_package_config_copy_dir" } }
注意:使用eval需确保变量内容安全,避免命令注入风险。
方案3:改用bash数组定义排除参数
若npm使用bash作为执行shell,可在脚本内定义数组存储排除规则:
{ "name": "tar", "version": "1.0.0", "config": { "local_dir": "/path/to/some/directory", "copy_dir": "some-folder" }, "scripts": { "tar:config": "cd $npm_package_config_local_dir && exclude_args=(--exclude='node_modules' --exclude='.DS_Store') && tar \"${exclude_args[@]}\" -pzcf example_config.tar.gz $npm_package_config_copy_dir" } }
内容的提问来源于stack exchange,提问作者Tomas Mulder
相关产品推荐
相关产品推荐

