Module 如何在jq中管理模块依赖关系

Module 如何在jq中管理模块依赖关系,module,jq,dependency-management,Module,Jq,Dependency Management,自版本1.5以来,有一个。模块由可选元数据和一组函数组成。比如说 module { name: "util", version: "1.0.0" }; def digitsum: tostring|split("")|map(tonumber)|add; 存储为fileutil.jq可以这样使用: $echo'789'| jq-L.'包括“util”;洋地黄' 24 模块可以使用其他模块,依赖项由modulemeta指令跟踪,但如何表示和检查模块编号的最低版本?例如: module {

自版本1.5以来,有一个。模块由可选元数据和一组函数组成。比如说

module { name: "util", version: "1.0.0" };
def digitsum: tostring|split("")|map(tonumber)|add;
存储为file
util.jq
可以这样使用:

$echo'789'| jq-L.'包括“util”;洋地黄'
24
模块可以使用其他模块,依赖项由
modulemeta
指令跟踪,但如何表示和检查模块编号的最低版本?例如:

module {
  name: "math",
  version: "0.1.0",
};

include "util"; # TODO: require at least version 1.0.0!

def digitroot:
  (.|digitsum) as $sum |
  if $sum<10 then $sum else $sum|digitroot end;
模块{
名称:“数学”,
版本:“0.1.0”,
};
包括“util”;#TODO:至少需要版本1.0.0!
def digitroot:
(.| digitsum)作为$sum|

如果$sumjq中的模块支持目前(2019年6月)仍然非常少,但github上有一个jq模块管理系统:

如果不使用这样的外部模块管理系统,jq本身可以做什么?扩展给定的示例,下面演示了一种支持版本需求的方法。注意
math
模块元数据中名为
dependencies
的附加键。(目前,由于jq会覆盖此密钥,因此无法将其命名为
deps
。)

文件夹 依赖项.jq math.jq
谢谢,这是一个有用的解决方法。我只需稍微修改命名(例如,
deps
而不是
require.jq
check
)和结构(元数据字段
require
应该是一个对象而不是一个数组,
check
函数也应该是一个数组)我已将数组更改为一个对象,并将它们全部重命名为
依赖项
,因为这样更容易记住,而且该字段在npm的
package.json
@Jakob中也以这种方式使用-请参阅更新重新祖先检查。使用.deps有点幼稚,但这只是一个开始。
# Recursively check specified version constraints 

module { name: "dependencies", version: "0.0.2" };

# parents of a module as defined by its .deps
def parents:
  . as $in
  | if type == "array" then map(parents) | add
    else modulemeta | .deps | map(.relpath)
    end ;

# ancestors of a single module or an array of modules.
# The array of "ancestors" of a module includes itself.
def ancestors:
  # input and $visited should be arrays of strings
  def ancestors($visited):
    . as $in
    | ($in - $visited) as $new
    | if $new == [] then $visited
      else $new | parents | ancestors($visited + $new | unique)
      end;
  if type == "array" then . else [.] end
  | ancestors([]) ;

def versionsort:
  def parse:
    sub("(?<a>(alpha|beta|gamma))"; "\(.a).")
    | [splits("[-.]")]
    | map(tonumber? // .) ;
  sort_by(parse);

# Input: a module name
# Emit empty if the constraints for the given module are satisfied, otherwise raise an error
def dependencies($version):
  def le($y):  (. == $y) or ([.,$y] | . == versionsort);

  modulemeta
  | .version as $mv
  | if (($mv == null) or ($version | le($mv))) then empty
    else ("module \(.name) dependencies version \($version) vs \($mv)" | error)
    end ;

# Input: a module name or array of module names
# Check the module-version dependencies in .dependencies, proceeding up the chain as defined by .deps
def dependencies:
  def check:
    modulemeta
    | select(has("dependencies"))
    | all( .dependencies | to_entries[];
           .key as $m | .value as $v | ($m | dependencies($v) ))
    | empty;
  ancestors[] | check;

module { name: "util", version: "1.0.0" };

def digitsum: tostring|split("")|map(tonumber)|add;
module { 
   name: "math",
   version: "0.1.0",
   dependencies: {"util": "1.0.0"} };

include "util" ;

def digitroot:
  digitsum as $sum
  | if $sum<10 then $sum
    else $sum|digitroot
    end;
jq -n -L . '
  include "dependencies";
  include "math";

  "math" | dependencies,
  (123|digitroot) '