2012-12-22 4 views
1

aws (s3, cloudfront, route53)에 정적 사이트를 배포하기위한 스크립트를 Python으로 작성하고 있습니다. 배포 할 때마다 모든 파일을 업로드하지 않으므로 md5 해시와 e- 태그 (s3은 개체의 md5 해시로 설정)를 비교하여 수정 된 파일을 확인합니다. 이것은 업로드하기 전에 내 빌드 스크립트가 gzips하는 파일을 제외한 모든 파일에서 잘 작동합니다. 파일을 들여다 보면, gzip은 실제로 순수한 함수가 아닌 것처럼 보입니다. 소스 파일이 변경되지 않은 경우에도 gzip을 실행할 때마다 출력 파일에 약간의 차이가 있습니다.파이썬에서 반복적으로 gzip 파일을 사용합니다.

내 질문은 : 정확히 동일한 입력을받은 동일한 파일을 안정적이고 반복적으로 출력 할 수있는 방법이 있습니까? 또는 파일 압축을 풀고 압축을 풀고 md5 해시를 계산하거나 대신 수동으로 e-tag 값을 설정하는 방법을 사용하는 것이 좋습니다. 제대로 알아 냈로

+0

gzip은 실제로 똑같은 입력에 대해 안정적입니다. 너 어떤 변화가 없어? 아마도 포함 된 보관 메타 데이터가 변경되었을 것입니다 (예 : '수정'이 파일을 생성 할 때마다 '지금'으로 설정)? –

+0

아니요 안정적이지 않습니다 –

+0

확실히 다른 메타 데이터 문제는 메타 데이터 문제 일뿐입니다. 그럼에도 불구하고이 문제를 해결할 수있는 좋은 방법이 있습니까? 그냥 내 빌드 스크립트를 수정하여 마지막으로 수정 된 스크립트를 일정하게 유지 하시겠습니까? –

답변

2

압축 된 데이터가 매번 동일합니다. 유일한 차이점은 머리글의 수정 시간 일 가능성이 높습니다. GzipFile의 다섯 번째 인수 (사용중인 경우)를 사용하면 헤더에 수정 시간을 지정할 수 있습니다. 첫 번째 인수는 헤더에 들어있는 파일 이름이므로 계속 동일하게 유지하려고합니다. 소스 데이터에 대해 네 번째 인수를 제공하면 첫 번째 인수는 헤더의 파일 이름 부분을 채우기 위해 사용됩니다.

+0

당신이 말한 것과'GzipFile' 생성자에서'mtime'을 상수로 설정 했나요? 매력처럼 작동했습니다! –

-1

gzip으로 안정되지 않습니다 :

[[email protected] ~]# touch a b 
[[email protected] ~]# gzip a 
[[email protected] ~]# gzip b 
[[email protected] ~]# md5sum a.gz b.gz 
8674e28eab49306b519ec7cd30128a5c a.gz 
4974585cf2e85113f1464dc9ea45c793 b.gz 
+3

두 파일의 메타 데이터가 다릅니다 ('a' 및'b'는 메타 데이터에 파일 이름 * 포함됨). 'gzip -c'를 사용하여 이전 파일을 대체하지 않는 새 파일을 만든 다음 입력 파일을 변경하지 않고 해당 절차를 반복하십시오. * * 출력을 테스트하면 출력이 안정적이라는 것을 알 수 있습니다. –

관련 문제