Go 如何仅将参数值传递给Makefile目标? 我来自NoDEJS世界,所以我认为MaFrm文件是NPM 包中的“脚本”部分。JSON,这可能是错误的(或不是?)。
因此,我的想法是在安装新的依赖项时,通过键入以下内容自动执行重复操作:Go 如何仅将参数值传递给Makefile目标? 我来自NoDEJS世界,所以我认为MaFrm文件是NPM 包中的“脚本”部分。JSON,这可能是错误的(或不是?)。,go,makefile,Go,Makefile,因此,我的想法是在安装新的依赖项时,通过键入以下内容自动执行重复操作: make install github.com/stretchr/testify 并找到一种方法来获取github.com/stretchr/authentic参数,而不必使用通常建议的重参数名称值声明FOO=bar(=>make install DEP=github.com/stretchr/authentic) 所以,下面,我尝试了这个: install %: go get $* godep save
make install github.com/stretchr/testify
并找到一种方法来获取github.com/stretchr/authentic
参数,而不必使用通常建议的重参数名称值声明FOO=bar
(=>make install DEP=github.com/stretchr/authentic
)
所以,下面,我尝试了这个:
install %:
go get $*
godep save ./...
git add Godeps vendor
git commit -m "godep: add $*"
但是没有成功:它在没有任何参数的情况下运行go-get
,并且git-commit-m“godep:add”
试验
1-当我这样做时:
install %:
echo $*
install %:
go get ${*}
我看到我的“github.com/stretchr/authorize”
2-当我这样做时:
install %:
echo $*
install %:
go get ${*}
它循环两次,首先运行go-get
,不带任何参数,然后运行go-get-github.com/stretchr/authentice
(根据需要)
它看起来像是
${*}
表示一个在目标之后解析字符组的参数的“数组”,第一个是install
和github.com/stretchr/autifest
之间的空格,第二个是github.com/stretchr/autifest
Make变量可能可以执行您想要的操作:
host> cat Makefile
install:
go get $(P)
godep save ./...
git add Godeps vendor
git commit -m "godep: add $(P)"
host> make install P=github.com/stretchr/testify
但使用make仅仅是为了实现这一点可能有点过头了。它不仅仅是一种脚本语言。Make变量可能可以实现您想要的功能:
host> cat Makefile
install:
go get $(P)
godep save ./...
git add Godeps vendor
git commit -m "godep: add $(P)"
host> make install P=github.com/stretchr/testify
但使用make仅仅是为了实现这一点可能有点过头了。它不仅仅是一种脚本语言。您不能在同一规则中使用显式目标和模式,因此您的规则
%install:
将不起作用
您可以使用GNU make来实现这一点,但它非常粗糙且容易出错,我不推荐使用它
ARG := $(filter-out install,$(MAKECMDGOALS))
install:
go get $(ARG)
godep save ./...
git add Godeps vendor
git commit -m "godep: add $(ARG)"
如您所见,您需要为没有其他参数或存在多个其他参数的情况添加处理,当然,如果不将目标放入筛选列表中,您就无法添加更多目标,等等
只是。。。这不是一个好办法
你为什么不这样做呢:
install-%:
go get $*
godep save ./...
git add Godeps vendor
git commit -m "godep: add $*"
然后运行:
make install-github.com/stretchr/testify
您不能在同一规则中使用显式目标和模式,因此您的规则%install:
将不起作用
您可以使用GNU make来实现这一点,但它非常粗糙且容易出错,我不推荐使用它
ARG := $(filter-out install,$(MAKECMDGOALS))
install:
go get $(ARG)
godep save ./...
git add Godeps vendor
git commit -m "godep: add $(ARG)"
如您所见,您需要为没有其他参数或存在多个其他参数的情况添加处理,当然,如果不将目标放入筛选列表中,您就无法添加更多目标,等等
只是。。。这不是一个好办法
你为什么不这样做呢:
install-%:
go get $*
godep save ./...
git add Godeps vendor
git commit -m "godep: add $*"
然后运行:
make install-github.com/stretchr/testify
这是不可能的。非变量定义的参数被解释为Makefile目标。我建议改为使用shell脚本,然后您可以说,/install github.com/…
实际上我觉得这是不可能的。我会这样做。非常感谢。只是@JanKrüger的一个子问题:在Makefile中声明shell脚本并解析原始参数应该是可能的,是吗?据我所知,make
的常见实现不允许您以任何方式访问原始参数make
根本不是为这种事情而设计的。你必须有一个旧版本的GNU make。该语法在一段时间内是非法的,后来又被重新添加,但由于Linux内核makefiles存在一些历史问题,因此发出了警告。你对“数组”的看法不正确。发生的情况是,该规则正在运行多次,对于您在命令行上指定的每个目标运行一次。每次运行时,自动变量$*
都会被适当设置。阅读手册很有帮助:这是不可能的。非变量定义的参数被解释为Makefile目标。我建议改为使用shell脚本,然后您可以说,/install github.com/…
实际上我觉得这是不可能的。我会这样做。非常感谢。只是@JanKrüger的一个子问题:在Makefile中声明shell脚本并解析原始参数应该是可能的,是吗?据我所知,make
的常见实现不允许您以任何方式访问原始参数make
根本不是为这种事情而设计的。你必须有一个旧版本的GNU make。该语法在一段时间内是非法的,后来又被重新添加,但由于Linux内核makefiles存在一些历史问题,因此发出了警告。你对“数组”的看法不正确。发生的情况是,该规则正在运行多次,对于您在命令行上指定的每个目标运行一次。每次运行时,自动变量$*
都会被适当设置。阅读手册很有帮助:我很清楚Makefile中的参数name-value参数,正如我在说明中所说;)这样做的目的是避免使用arg name部分,因为其他一些“任务自动机”可以这样做我们的想法是避免使用arg name部分,因为其他一些“任务自动机”可以这样做。除非我错了,否则我开始认为目标实际上是一种在make
之后解析所有内容的正则表达式,是吗?在接受您的答案之前,我只需要尝试其他方法。这是一种模式规则:这是一种隐式规则:它们与正则表达式无关。除非我错了,否则我开始认为目标实际上是一种在make
之后解析所有内容的正则表达式,是吗?在接受你的回答之前,我只需要试一下别的。那是私人助理