我想解析 npm ls 命令的结果,即依赖树来提取根级别的。我使用 Java 1.8 和 Runtime Process 和 ProcessBulder 来做到这一点。
我在两个平台上运行代码:1. Linux xxxxxxx-ThinkPad-W541 4.15.0-55-generic #60~16.04.2-Ubuntu SMP Thu Jul 4 09:03:09 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux 2. Linux xxx.xxx.xxx.xx 2.6.32-754.3.5.el6.x86_64 #1 SMP Thu Aug 9 11:56:22 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux Red Hat Enterprise Linux Server 版本 6.10(圣地亚哥)
在 Ubuntu 上它可以在 RHEL Linux 上正常工作,但它失败了
这是我的代码来做这个把戏
String cmdStr1 = "export PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; cd " + packageDir.toString() + "; npm ls --prod --depth=0 > " + this.workspaceDir.resolve("dependencies_tree.tmp") + ";";
String cmdStr2 = "cat " + this.workspaceDir.resolve("dependencies_tree.tmp") + " | sed -e 's/^├─┬ //;s/^├── //;s/^─┬ //;s/^└─┬ //;s/^└── //;' | sed '/^[^a-zA-Z0-9@.\\/-].*/d' | sed -e 's/\\^//' | sed '/deduped/d' | sed -e 's/UNMET DEPENDENCY //' | sed -e 's/UNMET OPTIONAL DEPENDENCY //' | sed '1 d' | sed -e 's/\\@/:/g' -e 's/^:/\\@/' | sort | uniq ";
String[] cmd1 = { "/bin/sh", "-c", cmdStr1};
String[] cmd2 = { "/bin/sh", "-c", cmdStr2};
try {
...
logger.debug("Running command: " + cmdStr1);
Process p1 = Runtime.getRuntime().exec(cmd1);
logger.trace(output(p1.getInputStream()));
int exitCode1 = p1.waitFor();
logger.debug("Result 1: " + exitCode1);
logger.debug("Running command: " + cmdStr2);
Process p2 = new ProcessBuilder(cmd2).redirectOutput(new File(dependenciesFileAbsolutePath)).start();
logger.debug(output(p2.getInputStream()));
int exitCode2 = p2.waitFor();
logger.debug("Result 2: " + exitCode2);
} catch (Exception e) {
}
第一个命令以退出代码 1 返回,第二个命令以退出代码 0 返回。对于第一个命令 - 它应该像这样返回,因为它的结果是 UNMET DEPENDENCIES。我无法让第二个命令在 RHEL 上运行
预期结果 - 是来自 npm ls in dependenciesFileAbsolutePath 输出的根级别依赖项列表 实际结果是一个空文件。
我怀疑第二个命令有问题,但为什么它只在 RHEL 上不起作用
需要你的帮助!