본문 바로가기
C.W.K.
Lesson 03 of 05 · published

맵에는 버전 정합이 없어

~14 min · swift, vendoring, architecture, implementation

Level 0흩어진 부품
0 XP0/48 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

파일 대 파일 맵이 볼 수 있는 것

복사 배달 기계는 맵이야. 원본 파일 하나, 도착 파일 하나, 그걸 받기로 한 소비자마다. 본문엔 정확해. 관계엔 말이 없어. 파일 A 가 파일 B 의 타입을 써도 맵은 그걸 몰라. B 를 적은 줄이 하나도 없는 소비자한테, 혹은 B 를 딴 데서 받아온 소비자한테 A 만 배달하고, 갖고 있는 줄은 하나같이 자기 원본이랑 깨끗하게 맞아.

잎한텐 그 침묵이 맞아. 생성된 어휘 바인딩은 키트 안 임포트가 없어. 시스템 키체인이랑 말하고 결과를 돌려주는 핀 도우미도 키트 안 임포트가 없어. 런처 본체 파일 복사본 여덟이 출처 스탬프를 세 가지로 달고 있어도, 본문만 같으면 해가 없어. 스탬프는 본문이 아니고, 그 파일들은 그래프를 안 만들거든.

서로 기대는 인프라는 그래프야. 정체성 타입에 기대는 울타리, 둘 다에 기대는 엔진, 문서 타입에 기대고 그 문서 타입은 디코더 도우미에 기대는 저장소. 이건 잎이 아냐. 잎처럼 배달하면, 어느 소비자의 줄이 한 파일만 싣고 다른 파일은 안 싣는 순간 실패가 와. 소비자 하나, 빌드 하나에서 컴파일 에러로. 맵의 어느 줄도 어긋남을 보고 안 하고. 맵은 맞는 바이트를 비교했어. 틀린 단위를 비교한 거야.

진짜 필요했던 단위는 컴파일러야

패키지는 빌드 하나야. 타깃은 저마다 따로인 모듈이지만, 전부 같은 트리에서 같은 빌드로 컴파일돼. 그래서 정합이 맞아. 컴파일러가 가장자리마다 실제로 옆에 놓인 그 판본에 대고 확인하거든. 파일 맵 위에 아무리 규율을 쌓아도 그 성질은 다시 못 만들어. 그러려면 파일이 뭘 뜻하는지 몰라야 하는 게 일의 전부인 스크립트 안에다 모듈 시스템을 손으로 다시 짓는 셈이야.

그래서 서로 기대는 스위프트는 옮겼어. 잎은 남았고. 생성된 카탈로그는 계속 생성으로 남았어. 그 권위는 어떤 스위프트 소스가 아니라 데이터 파일이거든. 그걸 패키지 상품으로 바꾸면, 손으로 쓴 네 번째 표를 잡으려고 있는 가드한테서 그 사본들이 숨어버려. 새 공용 스위프트 규칙은 이제 이래. 다른 공용 파일이 선언한 타입이나 함수를 쓰거나 다른 공용 파일이 그걸 쓰면, 그러니까 키트 안 가장자리 위에 앉아 있으면 패키지로 가. 그래프의 뿌리랑 잎은 같이 다녀. 그런 가장자리가 없으면, 파일 맵이 여전히 더 좁고 더 나은 기계야.

실제로 나눠 쓰는 단위를 볼 수 있는 기계를 골라. 본문을 나누는 건 파일 문제야. 그래프를 나누는 건 컴파일 문제고. 그래프에 파일 도구를 쓰면 검사는 초록인데 빌드는 빨개. 저장소는 둘로 갈리고 탓은 두 사람한테 돌아가는데, 그 어긋남은 어느 맵 줄도 짚지 못해.

잎을 집안 정리로 옮기지 마

남은 스위프트 잎은 못 끝낸 일이 아니야. 파일 맵이 여전히 맞는 답인 파일들이야. "정리하자"고 하나를 패키지로 옮기면 정합 이득 0 에 변환 값을 치르고, 다음 저자한테 필요한 규칙을 흐려. 필요한 규칙은 그래프냐 잎이냐지, 스위프트냐 아니냐가 아니야.

잎은 어떤 변경이 그걸 키트 안 가장자리 위에 올릴 때만 옮겨. 다른 공용 파일이 선언한 걸 쓰기 시작하거나, 다른 공용 파일이 그걸 쓰기 시작할 때. 두 번째 소비자가 생기는 것도, 복사본 둘이 공용 테스트를 원하는 것도 복사 기계 쪽 계기지, 잎을 패키지에 넣을 이유가 아니야. 가장자리가 나타나기 전까진 패키지랑 맵이 나란히 앉아 있고, 다음 레슨은 둘이 서로한테 손을 뻗으면 안 되는 이유야.

Code

같은 가족, 단위 둘, 맵은 하나만 봐·text
FILE MAP (one row per source file)
  kit/swift/PinHelper.swift     -> consumer A, B, C
  kit/data/brains.json
      rendered -> consumer A..N  (generated; authority is the json)

  What a row can say:   body matches, or it does not.
  What a row cannot say: Fence needs an Identity that no row
                         for this consumer delivers.

PACKAGE (one build from one tree, schematic — not a file listing)
  Core/
    Identity.swift
    Fence.swift           <- Fence uses Identity's types
                             (same module: no import line)
  Web/
    WebView.swift         <- Web imports Core to reach Fence
                             Core does not import Web

  What the compiler says: Core and Web are two modules, built in
  one build from one tree. Tuesday's fence cannot meet March's
  identity, because they are not two deliveries.

THE MISTAKE THE MAP WOULD MAKE IF YOU FORCED THE GRAPH INTO IT
  consumer A's rows name Fence.swift      (row green: body matches)
  no row names Identity.swift for A       (nothing to check: the map
                                           only compares what a
                                           consumer opted into)
  consumer A compiles                     (red: Fence needs a type no
                                           row delivered, and no row
                                           can say so)

External links

Exercise

네 시스템에서 한 언어의 공용 파일을 재고로 떠. 각각을 잎 (키트 안 가장자리 없음 — 다른 공용 파일의 타입이나 함수를 쓰지도 않고 남한테 쓰이지도 않음) 이나 그래프 (어느 방향으로든 그런 가장자리 위에 있음) 로 표시해. 그래프 표시마다 지금 배달 기계가 그 가장자리를 볼 수 있는지 적어. 못 보면, 조용한 버전 정합 구멍을 찾은 거야. 그 쌍을 짚지 못하는 초록 검사.
Hint
Python 이나 TypeScript 면 같은 공용 디렉터리 안에 대상이 있는 임포트를 찾아. 스위프트에선 그 검색이 아무것도 못 찾아. 한 모듈로 컴파일되는 파일끼리는 임포트 줄 없이 서로를 보거든. 그러니 다른 공용 파일들이 선언한 타입 이름, 함수 이름을 공용 파일마다 찾아봐. 지금 키트의 상태 칩도 맨 위엔 import SwiftUI 하나뿐인데 두뇌 제어 클라이언트의 상태 타입을 그대로 불러. 아무것도 안 쓰는 그래프 뿌리도 그래프 위에 있어. 앱을 넘는 참조는 안 쳐. 그건 소비자 문제야. 맵이 못 보는 건 같은 디렉터리 안의 가장자리야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.