`cmd/go`:即使二进制文件在其他情况下没有改变,也可以安装更改的mtimes,

epggiuax  于 5个月前  发布在  Go
关注(0)|答案(4)|浏览(57)

你使用的Go版本是什么( go version )?

$ go version
 go1.12.4 linux/amd64

这个问题在最新版本中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/ko1dli/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/ko1dli/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/mnt/c/Users/ko1dli/git/serverless-alias-search/src/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build698955985=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

$ ls -ltr ~/go/bin
total 1438344
-rwxrwxrwx 1 ko1dli ko1dli 16718552 May 30 18:38 alias-search
-rwxrwxrwx 1 ko1dli ko1dli 16120748 May 30 18:38 cognito-post-confirmation
-rwxrwxrwx 1 ko1dli ko1dli 22844935 May 30 18:38 create-account-collect
-rwxrwxrwx 1 ko1dli ko1dli 21897771 May 30 18:38 create-account-sign

$ date
Thu May 30 18:39:22 DST 2019

$ go install -x ./...
WORK=/tmp/go-build166854083

$ ls -ltr ~/go/bin
total 1438344
-rwxrwxrwx 1 ko1dli ko1dli 16718552 May 30 18:40 alias-search
-rwxrwxrwx 1 ko1dli ko1dli 16120748 May 30 18:40 cognito-post-confirmation
-rwxrwxrwx 1 ko1dli ko1dli 22844935 May 30 18:40 create-account-collect
-rwxrwxrwx 1 ko1dli ko1dli 21897771 May 30 18:40 create-account-sign

你期望看到什么?

我期望 go install 保持已安装文件不变,因为没有发生变化。

你看到了什么?

每个文件都被重新创建了一个新日期(通过 stat 检查)。我在Windows 10上使用WSL,不确定这是否会影响这种行为。

bxgwgixi

bxgwgixi1#

我原本期望安装后保留已安装的文件,因为没有发生变化。

您能详细说明为什么您期望这样吗?或者,这个问题给您带来了什么问题?

我在Windows 10上使用WSL,不确定这是否会影响这种行为。

值得注意的是,我在Linux上也看到了相同的行为,所以我认为这不是特定于Windows的问题。我认为目前这种情况是按照预期工作的。

jv4diomz

jv4diomz2#

我面临的问题在这个问题中描述,与AWS Cloudformation相关: aws/aws-cli#3131
我想你可以总是认为这是一个AWS Cloudformation的问题,但更一般地说,任何在确定二进制文件是否已更改时考虑创建/更改日期的实现都会遇到这个问题。

aamkag61

aamkag613#

比较 #33468
对比 #31629
CC @jayconrod

rseugnpd

rseugnpd4#

我认为这种行为是有意为之的,但如果文件没有过期,实际上不应该被覆盖。
go/src/cmd/go/internal/work/exec.go
第1572行到第1597行
| | // 我们是否足够聪明地避免完全重建取决于过期和重建算法以及Go构建缓存的状态。 |
| | // 我们不希望用户能够根据修改时间在“go install”期间是否发生变化来推断(或更糟的是开始依赖于)这些细节,所以尽最大努力更新文件的时间,使其看起来像是我们重写了a.Target,即使我们没有这样做。更新mtime |
| | // 还可能有助于其他依赖于我们之前更频繁更新的mtime的基于mtime的系统。 |
| | // 这仍然不是完美的——我们忽略了错误结果,如果文件由于某种原因不可写,那么假装已经写入它也是令人困惑的——但这可能比不做mtime更新要好。 |
| | // |
| | // 但是,不要为特殊情况执行此操作,即使用-linkshared隐式构建可执行文件时安装其所有依赖库。 |
| | // 我们尽可能地隐藏这个可怕的细节,所以不要通过触摸mtimes(通常库已经是最新的)来宣传它。 |
| | if!a.buggyInstall&&!b.IsCmdList { |
| | ifcfg.BuildN { |
| | b.Showcmd("", "touch %s", a.Target) |
| | } elseiferr:=allowInstall(a); err==nil { |
| | now:=time.Now() |
| | os.Chtimes(a.Target, now, now) |
| | } |
| | } |

相关问题