makefile如何为文件夹中的目标发送“是最新的”?

makefile如何为文件夹中的目标发送“是最新的”?,makefile,Makefile,我的makefile有一个.env的目标,它将创建一个.env文件。当文件已经存在时,我将收到make:`.env'是最新的 makefile类似于: .env: .env.sample @echo " ⚠️ Preparing local configuration..." @test -f .env && echo "$$DOTENV_ERROR" && exit 1 || true @cp .env.sample .env 但是

我的
makefile
有一个
.env
的目标,它将创建一个
.env
文件。当文件已经存在时,我将收到make:`.env'是最新的

makefile
类似于:

.env: .env.sample
    @echo "  ⚠️  Preparing local configuration..."
    @test -f .env && echo "$$DOTENV_ERROR" && exit 1 || true
    @cp .env.sample .env
但是,对于文件夹中的文件,我希望有相同的行为。比如:

./config/config.json: ./config/config.json.sample
    @echo "  ⚠️  Preparing local configuration..."
    @test -f ./config/config.json && echo "$$CONFIGJSON_ERROR" && exit 1 || true
    @cp config/config.json.sample config/config.json

而不是接收make:“./config/config.json”是最新的。我收到我的
CONFIGJSON\u错误
,我想收到相同的
.env
消息,说文件是最新的。

我认为有一个误解:如果出现两种情况之一,make将调用配方。首先是目标文件不存在。这似乎就是你在上面所依赖的

第二个问题是至少有一个先决条件比目标更新。在您的配方中,如果发生这种情况,您将失败,因为目标已存在,但目标已过期。这里似乎就是这样:目标
config/config.json
存在,但
config/config.json.sample
比它新


我真的不明白为什么你要在这种情况下抛出一个错误,所以很难提出替代方案。

我认为这是一个误解:如果两种情况中的任何一种发生,make将调用一个配方。首先是目标文件不存在。这似乎就是你在上面所依赖的

第二个问题是至少有一个先决条件比目标更新。在您的配方中,如果发生这种情况,您将失败,因为目标已存在,但目标已过期。这里似乎就是这样:目标
config/config.json
存在,但
config/config.json.sample
比它新


我真的不明白你为什么要在这种情况下抛出错误,所以很难提出替代方案。

我不完全确定你在追求什么样的行为,但我猜一下

如果目标不存在,或其任何依赖项比目标更新,Make将重建目标。因此,在您的情况下,我猜测
/config/config.json.sample
可能比
/config/config.json
更新。如果不想复制,即使.sample文件较新,也可以使用先决条件:

./config/config.json: | ./config/config.json.sample
     ...

结果是
.config/config.json
只有在不存在时才会重新生成(假设它没有其他依赖项)。如果这两个文件都不存在,那么
/config/config.json.sample
将在
/config/config.json
之前生成,我不完全确定您想要的是什么行为,但我猜一下

如果目标不存在,或其任何依赖项比目标更新,Make将重建目标。因此,在您的情况下,我猜测
/config/config.json.sample
可能比
/config/config.json
更新。如果不想复制,即使.sample文件较新,也可以使用先决条件:

./config/config.json: | ./config/config.json.sample
     ...

结果是
.config/config.json
只有在不存在时才会重新生成(假设它没有其他依赖项)。如果两个文件都不存在,那么
/config/config.json.sample
将在
/config/config.json

之前构建。谢谢,您真的很有帮助。但是,我不太理解你。“目标config/config.json存在,但config/config.json.sample比它新。”文件
config/config.json
,但文件
config/config.json.sample
也存在,这是什么意思。这两个文件都存在。如果出现错误,则表示
test-f./config/config.json
成功。如果
/config/config.json
文件存在,它将成功(这就是
test-f
所做的:它查看文件是否存在,如果存在则成功,如果不存在则失败)。谢谢,您真的很有帮助。但是,我不太理解你。“目标config/config.json存在,但config/config.json.sample比它新。”文件
config/config.json
,但文件
config/config.json.sample
也存在,这是什么意思。这两个文件都存在。如果出现错误,则表示
test-f./config/config.json
成功。如果
/config/config.json
文件存在,它将成功(这就是
test-f
所做的:它查看文件是否存在,如果存在则成功,如果不存在则失败)。