Dartdoc: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€์˜ null ์•ˆ์ „ ์ฃผ์„

์— ๋งŒ๋“  2020๋…„ 10์›” 21์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dart-lang/dartdoc

๋ฒˆ์‹ ๋‹จ๊ณ„:

# Extract package:retry version 3.0.1
$ curl -L https://storage.googleapis.com/pub-packages/packages/retry-3.0.1.tar.gz | tar -xz
$ pub get

# Get dartdoc from git
$ mkdir /source/dartdoc
$ git clone https://github.com/dart-lang/dartdoc.git /source/dartdoc
$ cd /source/dartdoc; pub get; cd -;

# Generate docs
$ dart /source/dartdoc/bin/dartdoc.dart 

pubspec.yaml ๋Œ€ํ•œ package:retry ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

environment:
  sdk: ">=2.0.0 <3.0.0"

๊ทธ๋ฆฌ๊ณ  .dart_tool/package_config.json ๋Š” package:retry ๋Œ€ํ•œ ์–ธ์–ด ๋ฒ„์ „ 2.0์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

{
  "configVersion": 2,
  "packages": [
    /* various other dependencies, mostly test and it's transitive dependencies, omitted here */
    {
      "name": "retry",
      "rootUri": "../",
      "packageUri": "lib/",
      "languageVersion": "2.0" // <-- language version 2.0, hence, no library in package:retry supports null-safety
    }
  ],
  "generated": "2020-10-21T10:44:27.912220Z",
  "generator": "pub",
  "generatorVersion": "2.10.0"
}

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ:

3PjXUKmqd6fA2M4

retry ํ•จ์ˆ˜๊ฐ€ null ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ๋งž์ง€๋งŒ ํŒจํ‚ค์ง€๋Š” null-safety๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์–ด๋–ค ์ข…๋ฅ˜์˜ null-safety ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

P1 bug nnbd

๋ชจ๋“  10 ๋Œ“๊ธ€

๋ฉ”๋ชจ. ๊ฐœ๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ null-safety๋ฅผ ์„ ํƒ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์˜ณ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๊ฐ€ null-safety๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฃผ์„์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋„ ์•ˆ์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋„ ์•ˆ์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ๋ฒ„์ „ >= 2.12.0์ด ์—†๋Š” ํŒจํ‚ค์ง€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— "null-safety"๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ํ‹€๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‚ด์ผ ์กฐ์‚ฌํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋„๋ฆฌ ํผ์ง„ ๊ฒฝ์šฐ(์ฆ‰, ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์ด์œ ๋กœ ์ด์™€ ๊ฐ™์ด ๋ชจ๋“  ๊ฒƒ์„ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค) ์•„๋งˆ๋„ P1์œผ๋กœ ์ƒ์Šนํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ถ„์„๊ธฐ๊ฐ€ ์ด๊ฒƒ์ด null-safe ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค์„ ์—ฌ์ „ํžˆ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ์ด์ œ ์šฐ๋ฆฌ๋Š” null ์•ˆ์ „ ํƒœ๊ทธ๋ฅผ ์—ฌ๊ธฐ์ €๊ธฐ์— ๋ฟŒ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@jcollins-g ๋ฉค๋ฒ„ ์ˆ˜์ค€์—์„œ ์ด ํƒœ๊ทธ๋ฅผ ์›ํ•˜๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด pub.dev์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” null ์•ˆ์ „์„ ํŒจํ‚ค์ง€ ์ˆ˜์ค€ ์†์„ฑ์œผ๋กœ ์ทจ๊ธ‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ „์ฒด ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ํฌํ•จ๋˜์ง€ ์•Š์Œ).

@mit-mit ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ ๋ชจ์Œ์„ ํƒ์ƒ‰ํ•˜๊ณ  ํŒจํ‚ค์ง€ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์„ ๋•Œ null ์•ˆ์ „ ํŒจํ‚ค์ง€์—(๋˜๋Š” ๋น ์ ธ๋‚˜์˜จ) ๋•Œ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉค๋ฒ„ ํƒœ๊ทธ๊ฐ€ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๊ฒƒ.

์—ฌ๊ธฐ์— ๋„ฃ์–ด๋„ ๋ ๊นŒ์š”?

Screenshot 2020-10-22 at 21 05 14

API ๋ฌธ์„œ ๋ชจ์Œ์„ ํƒ์ƒ‰ํ•˜๊ณ  ํŒจํ‚ค์ง€ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์„ ๋•Œ null ์•ˆ์ „ ํŒจํ‚ค์ง€์—(๋˜๋Š” ๋น ์ ธ๋‚˜์˜จ) ๋•Œ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฉค๋ฒ„ ํƒœ๊ทธ๊ฐ€ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๊ฒƒ.

์ผ๋ฐ˜์ ์œผ๋กœ null-safe ํŒจํ‚ค์ง€์—์„œ null-safeํ•˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋กœ ๋„˜์–ด์ง€๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

pub.dev ์—์„œ pana pub.dev ์˜ ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ํŒจํ‚ค์ง€๋ฅผ null-safety ๋ฅผ

  • ์–ธ์–ด ๋ฒ„์ „์€ >=2.12 .
  • ํŒจํ‚ค์ง€์— _์–ธ์–ด ๋ฒ„์ „ ๋งˆ์ปค_( // @dart=2.5 )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ null ์•ˆ์ „์„ ์„ ํƒ ํ•ด์ œํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ pub upgrade ํ•ด์ƒ๋„์˜ ๋ชจ๋“  ์ข…์†์„ฑ( dev_dependencies ์ œ์™ธ)์€ _null-safety_๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(์ด ์žฌ๊ท€ ์ •์˜์— ๋”ฐ๋ฆ„).

๋”ฐ๋ผ์„œ null ์•ˆ์ „์„ ์ง€์›ํ•˜๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์‹ค์ˆ˜๋กœ null ์•ˆ์ „์ด ์•„๋‹Œ ํŒจํ‚ค์ง€/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ null-safe๊ฐ€ ์•„๋‹Œ ํŒจํ‚ค์ง€์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Google ๊ฒ€์ƒ‰์—์„œ ๋ฌธ์„œ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„์„œ ๋ฌธ์„œ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์€ ๊ฒฝ์šฐ์—๋„ ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€ ๋ ˆ์ด๋ธ”์ด ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ https://github.com/dart-lang/sdk/issues/43903 ์œผ๋กœ ์ธํ•ด ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋กœ ๋ฐํ˜€์กŒ์œผ๋ฉฐ ์‹คํ—˜ ํ”Œ๋ž˜๊ทธ์™€ ์‚ฌ์šฉ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. nullable์ด ์•„๋‹Œ ๊ฒฝ์šฐ. ์ด ๋ฌธ์ œ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด ๋˜๋ฉด "์‚ฌ๋ผ์งˆ" ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ณง ๋ถ„์„๊ธฐ์—์„œ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์„ค์ •๋œ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ํƒœ๊ทธ๊ฐ€ ์ž ์‹œ ๋™์•ˆ ์ž˜๋ชป๋˜๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์›”์š”์ผ์— ๋ถ„์„ ํŒ€๊ณผ ๋…ผ์˜ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์˜ค๋Š˜ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋‚˜์œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด๋„ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์€ @scheglov๊ฐ€ ์ด๋ฏธ #2309์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์„๊ธฐ์™€ dartdoc์—์„œ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๊ณ  ์ผ๋ถ€ Windows ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ #2309๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ PR์„ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์˜ #2309๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‹œ๋„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์งง์€ ๋ฒ„์ „์€ dartdoc์ด ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ์ผ๋ถ€ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๊ฐ„ ๋‚ด์— ํ•ด๊ฒฐ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

"์ˆ˜์ •"ํ•˜๋ ค๋Š” ๋‘ ๋ฒˆ์งธ ์‹œ๋„๋Š” dartdoc ๋‚ด๋ถ€์˜ pubspec ์ฝ๊ธฐ ๋…ผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ด์—ˆ์ง€๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @scheglov ๋Š” ์ด๊ฒƒ์ด ํŒจํ‚ค์ง€๋ฅผ AnalysisDriver์— ์ „๋‹ฌํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์œผ๋ฉฐ ์‹ค์ œ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

2411์€ ์˜ฌ๋ฐ”๋ฅธ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ AnalysisDriver์— ์ „๋‹ฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

AnalysisContextCollection์— ๋Œ€ํ•œ ํฌํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„๊ทธ #2410์„ ์ œ์ถœํ•˜์—ฌ ํ•ด๋‹น ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋ฏธ๋ž˜์— ์ด์™€ ๊ฐ™์€ ๋” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

null ์•ˆ์ „ ํƒœ๊ทธ์˜ ์œ„์น˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ @mit-mit์˜ ์˜๊ฒฌ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„๊ทธ #2409๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

#2411์ด ์ถœ์‹œ๋œ ํ›„ ๋‹ซ๊ณ  ์ƒˆ ๋ฒ„์ „์„ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰