0

我想解析 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 上不起作用

需要你的帮助!

4

0 回答 0