ฉันจะเพิ่มข้อคิดเห็นไปยัง package.json สำหรับการติดตั้ง npm ได้อย่างไร


380

ฉันมีไฟล์ package.json ง่ายและฉันต้องการเพิ่มความคิดเห็น มีวิธีการทำเช่นนี้หรือมีแฮ็กที่จะทำให้งานนี้หรือไม่?

{
  "name": "My Project",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express": "3.x",
    "mongoose": "3.x"
  },
  "devDependencies" :  {
    "should": "*"
    /* "mocha": "*" not needed as should be globally installed */
  }
}

ความคิดเห็นตัวอย่างด้านบนไม่สามารถใช้งานได้เมื่อเวลาผ่านไปถึงเที่ยงคืน ฉันยังลอง // ความคิดเห็นสไตล์



17
@YehudaKatz - ฉันไม่คิดว่าซ้ำซ้อนกับคำถามนี้เฉพาะpackage.jsonไฟล์และมีpackage.jsonคำตอบเฉพาะในรายชื่อผู้รับจดหมายของ NodeJS
Mark Evans

2
หนึ่งในนักพัฒนา NPM หลักได้ปฏิเสธpackage.jsonที่จะพิจารณาสนับสนุนความคิดเห็นใน โปรดแสดงความคิดเห็นเกี่ยวกับปัญหานั้น - เราอาจแสดงความคิดเห็นที่มีประโยชน์ได้
Dan Dascalescu

5
แท็กเดียว <sarcasm /> JSON5 สนับสนุนความคิดเห็นjson5.org
Cristian E.

คำตอบ:


450

เมื่อเร็ว ๆ นี้ได้รับการกล่าวถึงในรายชื่อผู้รับจดหมาย Node.js

ตาม Isaac Schlueter ผู้สร้าง npm:

... ปุ่ม "//" จะไม่ถูกใช้งานโดย npm เพื่อวัตถุประสงค์ใด ๆ และสงวนไว้สำหรับความคิดเห็น ... หากคุณต้องการใช้ความคิดเห็นหลายบรรทัดคุณสามารถใช้อาร์เรย์หรือหลาย "//" กุญแจ

เมื่อใช้เครื่องมือปกติของคุณ (npm, ไหมพรม, ฯลฯ ) คีย์ "//" หลายรายการจะถูกลบออก สิ่งนี้มีชีวิต:

{ "//": [ 
  "first line", 
  "second line" ] } 

สิ่งนี้จะไม่รอด:

{ "//": "this is the first line of a comment", 
  "//": "this is the second line of the comment" } 

58
มีวิธีในการบันทึกว่าแต่ละรายการในส่วน 'การอ้างอิง' คืออะไร เคล็ดลับ "//" ใช้งานไม่ได้เมื่อ attr ของ 'dependencies'
rynop

8
โปรดทราบว่าการใช้ความคิดเห็นหลายรายการดังในตัวอย่างแรก{ "//": "first", "//": "second"}จะป้องกันไม่ให้คุณใช้npm versionและบรรทัดคำสั่งอื่น ๆ ซึ่งปกติจะแยกทั้ง JSON ใหม่และยกเลิกคีย์ที่ซ้ำกันในกระบวนการ
jakub.g

60
เราต้องระวังว่า "//" สามารถใช้ได้ที่รูทของpackage.jsonวัตถุเท่านั้น ตัวอย่างเช่น{ "dependencies": { "//": "comment?" }}ไม่ถูกต้อง แต่{ "//": "comment!", "dependencies":{}}ถูกต้อง
david_p

52
แม้แต่ Douglas Crockford ก็ไม่มีปัญหาในการใส่ความคิดเห็นในไฟล์กำหนดค่า JSON สถานการณ์ที่มี NPM เป็นเรื่องโง่ที่จะพูดน้อย
Muhammad Rehan Saeed

5
จากประสบการณ์ของฉันที่"//"สำคัญและความคุ้มค่าได้รับการเช็ดในที่สุด มีวิธีที่จะแสดงความคิดเห็นแบบถาวรหรือไม่?
pruett

116

นี่คือแฮ็คอื่นสำหรับการเพิ่มความคิดเห็นใน JSON ตั้งแต่:

{"a": 1, "a": 2}

มีค่าเท่ากับ

{"a": 2}

คุณสามารถทำสิ่งที่ชอบ:

{
  "devDependencies": "'mocha' not needed as should be globally installed",
  "devDependencies" :  {
    "should": "*"
  }
}

12
ใช้งานได้ในระดับแพ็คเกจเฉพาะ ตัวอย่างเช่น. "express": "makes routing better so I don't want to gouge my eyes out", "express": "3.x". ใช่ "yuck" ดังที่ ColinE พูดและ "ขอบคุณ" ดังที่ ColinE กล่าว
juanpaco

22
โปรดทราบว่าแฮ็คนี้จะป้องกันคุณจากการเปลี่ยนpackage.jsonวิธีการเขียนโปรแกรมโดยnpm version 1.2.3การชนรุ่น - รายการที่ซ้ำซ้อนจะถูกลบออกจาก JSON ที่เป็นผลลัพธ์
jakub.g

16
นี่เป็นคำแนะนำที่ไม่ถูกต้องเนื่องจากไม่สามารถรับประกันลำดับของวัตถุ ตัวอย่างเช่นในบางสถานการณ์ตัวอย่างของคุณอาจจบลงด้วยการเป็น 1 แทน 2
Jo Sprague

6
@mpen ความเสี่ยงคือไม่มีการรับประกันว่ารหัสในการแยกวิเคราะห์ JSON จะทำตามลำดับ
Jo Sprague

7
สำหรับเร็กคอร์ดนั้นRFCกล่าวอย่างชัดเจนว่า: "เมื่อชื่อภายในวัตถุไม่ซ้ำกันพฤติกรรมของซอฟต์แวร์ที่ได้รับวัตถุดังกล่าวนั้นไม่สามารถคาดการณ์ได้การใช้งานจำนวนมากรายงานคู่สุดท้ายของชื่อ / ค่าเท่านั้นการใช้งานอื่น ๆ รายงานข้อผิดพลาดหรือล้มเหลว ในการแยกวิเคราะห์วัตถุและการใช้งานบางอย่างรายงานคู่ของชื่อ / ค่าทั้งหมดรวมถึงรายการที่ซ้ำกัน "
Alan Tam

106

หลังจากเสียเวลาหนึ่งชั่วโมงในการแก้ปัญหาที่ซับซ้อนและแฮ็คฉันได้พบทั้งวิธีที่ง่ายและถูกต้องสำหรับการแสดงความคิดเห็นส่วนการอ้างอิงขนาดใหญ่ของฉันpackage.jsonมา เช่นนี้

{
  "name": "package name",
  "version": "1.0",
  "description": "package description",
  "scripts": {
    "start": "npm install && node server.js"
  },
  "scriptsComments": {
    "start": "Runs development build on a local server configured by server.js"
  },
  "dependencies": {
    "ajv": "^5.2.2"
  },
  "dependenciesComments": {
    "ajv": "JSON-Schema Validator for validation of API data"
  }
}

เมื่อเรียงในลักษณะเดียวกันก็ตอนนี้ง่ายมากสำหรับผมที่จะติดตามคู่เหล่านี้การอ้างอิง / ความคิดเห็นทั้งในคอมไพล์กระทำ diffs package.jsonหรือในการแก้ไขขณะที่ทำงานกับ

และไม่มีเครื่องมือเพิ่มเติมที่เกี่ยวข้องเพียงแค่ JSON ธรรมดาและถูกต้อง

หวังว่านี่จะช่วยทุกคน


1
วิธีนี้ทำให้รู้สึกมากขึ้นและทำให้สิ่งต่าง ๆ สะอาด
Hitesh Sahu

4
ขอบคุณสำหรับโซลูชันที่ไม่แฮ็กที่ใช้ได้จริงและมีความหมายทางเทคนิค
Roy Tinker

5
สำหรับความคิดเห็นเกี่ยวกับสคริปต์ทำไมไม่ให้สคริปต์ "ช่วย" เช่น "scripts": { "postinstall": "echo postinstall stuff goes here", "help-postinstall": "echo helpful stuff goes here" }
ยอด

1
@peak ขอบคุณ! ข้อเสียเดียวที่ฉันเห็นคือสคริปต์จริงจะถูกผสมกับความคิดเห็น
gkond

1
@ gkond ขอบคุณสำหรับสิ่งนี้ ทำให้รู้สึกมากที่สุดสำหรับฉัน
Robin Winslow

20

แนวคิดที่น่าสนใจมากมาย

สิ่งที่ฉันทำคือ:

{
  ...
  "scripts": {
    "about": "echo 'Say something about this project'",
    "about:clean": "echo 'Say something about the clean script'",
    "clean": "do something",
    "about:build": "echo 'Say something about building it'",
    "build": "do something",
    "about:watch": "echo 'Say something about how watch works'",
    "watch": "do something",
  }
  ...
}

วิธีนี้ฉันสามารถอ่าน "หลอกความคิดเห็น" ในสคริปต์เองและเรียกใช้บางอย่างต่อไปนี้เพื่อดูความช่วยเหลือบางอย่างในเทอร์มินัล:

npm run about
npm run about:watch

2 เซ็นต์ของฉันสำหรับการสนทนานี้ :)


ฉลาดฉันชอบมัน
KorreyD

14

NPS (สคริปต์แพ็คเกจโหนด) แก้ไขปัญหานี้ให้ฉัน ให้คุณใส่สคริปต์ NPM ของคุณลงในไฟล์ JS แยกซึ่งคุณสามารถเพิ่มความคิดเห็นมากมายและตรรกะ JS อื่น ๆ ที่คุณต้องการ https://www.npmjs.com/package/nps

ตัวอย่างของโครงการpackage-scripts.jsหนึ่งจากของฉัน

module.exports = {
  scripts: {
    // makes sure e2e webdrivers are up to date
    postinstall: 'nps webdriver-update',

    // run the webpack dev server and open it in browser on port 7000
    server: 'webpack-dev-server --inline --progress --port 7000 --open',

    // start webpack dev server with full reload on each change
    default: 'nps server',

    // start webpack dev server with hot module replacement
    hmr: 'nps server -- --hot',

    // generates icon font via a gulp task
    iconFont: 'gulp default --gulpfile src/deps/build-scripts/gulp-icon-font.js',

    // No longer used
    // copyFonts: 'copyfiles -f src/app/glb/font/webfonts/**/* dist/1-0-0/font'
  }
}

ฉันเพิ่งจะติดตั้งในพื้นที่npm install nps -save-devและใส่ไว้ในpackage.jsonสคริปต์ของฉัน

"scripts": {
    "start": "nps",
    "test": "nps test"
}

13

คุณสามารถละเมิดข้อเท็จจริงที่ว่าคีย์ที่ซ้ำกันจะถูกเขียนทับ นี่คือสิ่งที่ฉันเพิ่งเขียน:

"dependencies": {
  "grunt": "...",
  "grunt-cli": "...",

  "api-easy": "# Here is the pull request: https://github.com/...",
  "api-easy": "git://..."

  "grunt-vows": "...",
  "vows": "..."
}

อย่างไรก็ตามยังไม่ชัดเจนว่า JSON อนุญาตให้ทำซ้ำคีย์ได้หรือไม่ (ดู ไวยากรณ์ JSON อนุญาตให้ใช้คีย์ซ้ำกันในวัตถุหรือไม่ดูเหมือนว่าจะทำงานกับ npm ได้หรือไม่ดังนั้นฉันจึงรับความเสี่ยง

แฮ็คที่แนะนำคือการใช้ "//"คีย์ (จากรายการส่งเมลของ nodejs ) เมื่อฉันทดสอบมันไม่ทำงานกับส่วน "การอ้างอิง" นอกจากนี้ตัวอย่างในโพสต์ใช้หลาย"//"คีย์ซึ่งหมายความว่า npm ไม่ปฏิเสธไฟล์ JSON ด้วยคีย์ซ้ำ กล่าวอีกนัยหนึ่งการแฮ็คข้างต้นควรจะดีอยู่เสมอ

อัปเดต:ข้อเสียที่น่ารำคาญอย่างหนึ่งของการแฮ็กคีย์ที่ซ้ำกันคือการnpm install --saveกำจัดข้อมูลที่ซ้ำซ้อนทั้งหมด น่าเสียดายที่มันง่ายมากที่จะมองข้ามและความคิดเห็นที่ตั้งใจไว้ของคุณก็หายไป

"//"สับยังคงเป็นที่ปลอดภัยที่สุดที่ดูเหมือนว่า อย่างไรก็ตามความคิดเห็นของหลายคู่สายจะถูกลบออกโดยnpm install --saveมากเกินไป


1
"//"สับไม่ทำงานภายใน devDependencies NPM พยายามแก้ไขพา ธ UNC
Dmitry S.

ขอบคุณสำหรับการอัปเดตประโยค แต่ก็ไม่สามารถแสดงความคิดเห็นmochaได้ เพียงแค่สามารถเพิ่มมากกว่าหนึ่งรายการได้และจะใช้งานโดย npm ในตอนท้าย
vusan

ฉันเกลียดที่จะยอมรับมัน - แต่ฉันชอบสิ่งนี้ดีกว่า "//"
roocell

9

ฉันมีความคิดแฮ็คที่ตลก

สร้างชื่อแพ็กเกจ npm อย่างเหมาะสมในฐานะตัวแบ่งความคิดเห็นสำหรับdependenciesและdevDependenciesบล็อกใน package.json ตัวอย่างเช่นx----x----x

{
    "name": "app-name",
    "dependencies": {
        "x----x----x": "this is the first line of a comment",
        "babel-cli": "6.x.x",
        "babel-core": "6.x.x",
        "x----x----x": "this is the second line of a comment",
        "knex": "^0.11.1",
        "mocha": "1.20.1",
        "x----x----x": "*"
    }
}

หมายเหตุ : ต้องเพิ่มบรรทัดตัวแบ่งความคิดเห็นล่าสุดด้วยรุ่นที่ถูกต้องเช่น*ในบล็อก


6
ใช่มีให้บริการแล้ว: npmjs.com/package/x----x----x
revelt

9
รู้สึกตื่นเต้นเกี่ยวกับคำตอบนี้ แต่หลังจากฉันnpm installใช้ (ใช้ npm 5) คีย์ที่ซ้ำกันของฉันจะถูกลบโดยอัตโนมัติ :(
Eric Majerus

@EricMajerus oops ~, npm5 ทำลายหัวใจของฉันด้วย :(
Liao San Kai

8

แรงบันดาลใจจากกระทู้นี้นี่คือสิ่งที่เรากำลังใช้ :

{
  "//dependencies": {
    "crypto-exchange": "Unified exchange API"
  },
  "dependencies": {
    "crypto-exchange": "^2.3.3"
  },
  "//devDependencies": {
    "chai": "Assertions",
    "mocha": "Unit testing framwork",
    "sinon": "Spies, Stubs, Mocks",
    "supertest": "Test requests"
  },
  "devDependencies": {
    "chai": "^4.1.2",
    "mocha": "^4.0.1",
    "sinon": "^4.1.3",
    "supertest": "^3.0.0"
  }
}

7

จนถึงตอนนี้ "แฮ็ก" ส่วนใหญ่ที่นี่แนะนำให้ใช้ JSON ในทางที่ผิด แต่ทำไมไม่ใช้ภาษาสคริปต์พื้นฐานในทางที่ผิด?

แก้ไขการตอบสนองเริ่มต้นคือการใส่คำอธิบายทางด้านขวาโดยใช้# add comments hereเพื่อตัดคำ อย่างไรก็ตามสิ่งนี้ไม่สามารถใช้งานได้บน Windows เนื่องจากการตั้งค่าสถานะ (เช่นการเรียกใช้ npm myframework - --myframework-flags) จะถูกละเว้น ฉันเปลี่ยนคำตอบเพื่อให้มันทำงานได้บนทุกแพลตฟอร์มและเพิ่มการเยื้องเพื่อวัตถุประสงค์ในการอ่าน

{
 "scripts": {
    "help": "       echo 'Display help information (this screen)';          npm run",
    "myframework": "echo 'Run myframework binary';                          myframework",
    "develop": "    echo 'Run in development mode (with terminal output)';  npm run myframework"
    "start": "      echo 'Start myFramework as a daemon';                   myframework start",
    "stop":  "      echo 'Stop the myFramework daemon';                     myframework stop"
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

นี่จะ:

  1. ไม่ทำลายการปฏิบัติตามกฎของ JSON (หรืออย่างน้อยก็ไม่ใช่แฮ็คและ IDE ของคุณจะไม่ให้คำเตือนสำหรับการทำสิ่งที่แปลกและอันตราย)
  2. ทำงานข้ามแพลตฟอร์ม (ทดสอบบน macOS และ windows โดยสมมติว่าทำงานได้ดีบน Linux)
  3. ไม่ได้รับในทางของการทำงาน npm run myframework -- --help
  4. จะแสดงผลข้อมูลที่มีความหมายเมื่อทำงาน npm run (ซึ่งเป็นคำสั่งจริงที่จะเรียกใช้เพื่อรับข้อมูลเกี่ยวกับสคริปต์ที่มีอยู่)
  5. แสดงคำสั่งวิธีใช้ที่ชัดเจนยิ่งขึ้น (ในกรณีที่ devs บางคนไม่ทราบว่าการเรียกใช้ npm แสดงผลลัพธ์ดังกล่าว)
  6. จะแสดงทั้งคำสั่งและคำอธิบายเมื่อเรียกใช้คำสั่งนั้น
  7. ค่อนข้างอ่านได้เมื่อเพิ่งเปิดpackage.json(ใช้lessหรือ IDE ที่คุณชื่นชอบ)

Argh จริง ๆ แล้วบน Windows มันจะไม่สนใจค่าสถานะดังนั้น 3. ไม่เป็นความจริง: /
Marc Trudel

ทำให้เป็น windows cmd เข้ากันได้กับ: &&แทนที่จะ;เป็นคำสั่งแรก:"help": "echo 'Display help information (this screen)' && npm run",
phil_lgr

1
ใช่นั่นคือสิ่งที่ฉันทำลงไป จับดี!
Marc Trudel

3
ใช้งานได้เฉพาะในscriptsส่วน package.jsonเป็นสิ่งอื่น ๆ อีกมากมาย
Rolf

แก้ไข. จากนั้นอีกครั้งคุณจะรู้สึกว่าต้องมีเอกสารอะไรอีกในนั้น
Marc Trudel

6

นี่คือความคิดเห็นของฉันภายในpackage.json/bower.json :

ฉันมีที่มีสคริปต์ที่ส่งออกที่เกิดขึ้นจริงpackage.json.js package.jsonการเรียกใช้สคริปต์จะเขียนทับสิ่งเก่าpackage.jsonและบอกฉันว่ามีการเปลี่ยนแปลงอะไรบ้างสมบูรณ์แบบที่จะช่วยคุณติดตามการเปลี่ยนแปลงอัตโนมัติnpmทำ ด้วยวิธีนี้ฉันยังสามารถกำหนดแพ็คเกจที่ฉันต้องการใช้โดยทางโปรแกรม

งาน Grunt ล่าสุดอยู่ที่นี่: https://gist.github.com/MarZab/72fa6b85bc9e71de5991


ฉันคิดว่านี่เป็นคำตอบที่ "ถูกต้อง" ในหลาย ๆ วิธี (งานเพื่อแยกความคิดเห็นด้วยการปะแก้ต่างไปยังบัญชีสำหรับการเปลี่ยนแปลงแถบโพสต์) - อย่างไรก็ตามฉันเข้าใจว่าน้ำหนักที่เพิ่มขึ้นของงานที่ทำเสียงฮึดฮัดไม่ใช่สิ่งที่บางคน หลังจาก, สำหรับโครงการขนาดเล็ก, น่าจะดีที่สุดที่จะเก็บไฟล์ภายนอกสำหรับความเห็นและใช้ NPM scrpts (หลีกเลี่ยงการสร้างงานโดยสิ้นเชิง) สำหรับโครงการขนาดใหญ่คุณอาจกำลังใช้งานรูปแบบบางอย่างดังนั้นวิธีนี้จึงดูดี ระหว่างสองคนนี้ฉันคิดว่าการปรับข้อเสนอแนะ "//" เพื่อลิ้มรส (การหลีกเลี่ยงอาการปวดเฉพาะจุด) เป็นเรื่องที่ดีที่สุดที่สามารถทำได้
Enull

1
ผมชอบความคิดนี้ แต่เป็นคนถามเค้าสิ่งที่เกี่ยวกับกรณีที่คุณกำลังปรับเปลี่ยน package.json เดิมผ่านnpm install --saveหรือ--save-dev?
Isochronous

ใช่ฉันหายไปความคิดเห็นเหล่านั้น; ไม่มีวิธีแก้ปัญหาที่ดีฉันเคยดู git diffs และอัปเดตไฟล์. js ของฉันหลังจากอัปเดต
MarZab

1

ฉันจบลงด้วยสิ่งscriptsนั้น:

  "scripts": {
    "//-1a": "---------------------------------------------------------------",
    "//-1b": "---------------------- from node_modules ----------------------",
    "//-1c": "---------------------------------------------------------------",
    "ng": "ng",
    "prettier": "prettier",
    "tslint": "tslint",
    "//-2a": "---------------------------------------------------------------",
    "//-2b": "--------------------------- backend ---------------------------",
    "//-2c": "---------------------------------------------------------------",
    "back:start": "node backend/index.js",
    "back:start:watch": "nodemon",
    "back:build:prod": "tsc -p backend/tsconfig.json",
    "back:serve:prod": "NODE_ENV=production node backend/dist/main.js",
    "back:lint:check": "tslint -c ./backend/tslint.json './backend/src/**/*.ts'",
    "back:lint:fix": "yarn run back:lint:check --fix",
    "back:check": "yarn run back:lint:check && yarn run back:prettier:check",
    "back:check:fix": "yarn run back:lint:fix; yarn run back:prettier:fix",
    "back:prettier:base-files": "yarn run prettier './backend/**/*.ts'",
    "back:prettier:fix": "yarn run back:prettier:base-files --write",
    "back:prettier:check": "yarn run back:prettier:base-files -l",
    "back:test": "ts-node --project backend/tsconfig.json node_modules/jasmine/bin/jasmine ./backend/**/*spec.ts",
    "back:test:watch": "watch 'yarn run back:test' backend",
    "back:test:coverage": "echo TODO",
    "//-3a": "---------------------------------------------------------------",
    "//-3b": "-------------------------- frontend ---------------------------",
    "//-3c": "---------------------------------------------------------------",
    "front:start": "yarn run ng serve",
    "front:test": "yarn run ng test",
    "front:test:ci": "yarn run front:test --single-run --progress=false",
    "front:e2e": "yarn run ng e2e",
    "front:e2e:ci": "yarn run ng e2e --prod --progress=false",
    "front:build:prod": "yarn run ng build --prod --e=prod --no-sourcemap --build-optimizer",
    "front:lint:check": "yarn run ng lint --type-check",
    "front:lint:fix": "yarn run front:lint:check --fix",
    "front:check": "yarn run front:lint:check && yarn run front:prettier:check",
    "front:check:fix": "yarn run front:lint:fix; yarn run front:prettier:fix",
    "front:prettier:base-files": "yarn run prettier \"./frontend/{e2e,src}/**/*.{scss,ts}\"",
    "front:prettier:fix": "yarn run front:prettier:base-files --write",
    "front:prettier:check": "yarn run front:prettier:base-files -l",
    "front:postbuild": "gulp compress",
    "//-4a": "---------------------------------------------------------------",
    "//-4b": "--------------------------- cypress ---------------------------",
    "//-4c": "---------------------------------------------------------------",
    "cy:open": "cypress open",
    "cy:headless": "cypress run",
    "cy:prettier:base-files": "yarn run prettier \"./cypress/**/*.{js,ts}\"",
    "cy:prettier:fix": "yarn run front:prettier:base-files --write",
    "cy:prettier:check": "yarn run front:prettier:base-files -l",
    "//-5a": "---------------------------------------------------------------",
    "//-5b": "--------------------------- common ----------------------------",
    "//-5c": "---------------------------------------------------------------",
    "all:check": "yarn run back:check && yarn run front:check && yarn run cy:prettier:check",
    "all:check:fix": "yarn run back:check:fix && yarn run front:check:fix && yarn run cy:prettier:fix",
    "//-6a": "---------------------------------------------------------------",
    "//-6b": "--------------------------- hooks -----------------------------",
    "//-6c": "---------------------------------------------------------------",
    "precommit": "lint-staged",
    "prepush": "yarn run back:lint:check && yarn run front:lint:check"
  },

ความตั้งใจของฉันที่นี่ไม่ได้ทำให้กระจ่างหนึ่งบรรทัดเพียงเพื่อให้มีตัวคั่นบางอย่างระหว่างสคริปต์ของฉันสำหรับแบ็กเอนด์ส่วนหน้าทั้งหมดและอื่น ๆ

ฉันไม่ใช่แฟนตัวยงของ 1a, 1b, 1c, 2a, ... แต่กุญแจแตกต่างกันและฉันไม่มีปัญหาอะไรเลย


1

เนื่องจากคำตอบนี้อธิบายว่า//สงวนคีย์ไว้เพื่อให้สามารถใช้ตามความคิดเห็นได้ตามปกติ ปัญหาเกี่ยวกับ//ความคิดเห็นคือมันไม่สามารถใช้ในdependenciesและdevDependenciesการอ้างอิงปกติกับสตริงเป็นข้อ จำกัด รุ่น:

"dependencies": {
  "//": "comment"
}

ก่อให้เกิดข้อผิดพลาด

npm ข้อผิดพลาด! รหัส EINVALIDPACKAGENAME

npm ข้อผิดพลาด! ชื่อแพ็คเกจไม่ถูกต้อง "//": ชื่อสามารถใช้อักขระที่เป็นมิตรกับ URL เท่านั้น

แม้ว่าคีย์ที่มีค่าที่ไม่ใช่สตริงจะถือว่าเป็นการพึ่งพาที่ไม่ถูกต้องและไม่สนใจอย่างมีประสิทธิภาพ:

"dependencies": {
  "//": ["comment"]
}

การพึ่งพาตัวเองสามารถแสดงความคิดเห็นในลักษณะเดียวกัน:

"dependencies": {
  "foo": ["*", "is not needed now"],
}

เนื่องจากการเรียงลำดับการพึ่งพาถูกจัดเรียงเมื่อ package.json ถูกแก้ไขโดย NPM จึงไม่สามารถทำการแสดงความคิดเห็นเหนือการอ้างอิงที่อ้างถึง:

"dependencies": {
  "bar": "*",
  "//": ["should be removed in 1.x release"]
  "foo": "*",
}

คีย์ความคิดเห็นควรตั้งชื่อตามถ้ามันหมายถึงบรรทัดที่เฉพาะเจาะจงดังนั้นมันจะไม่ถูกย้าย:

"dependencies": {
  "bar": "*",
  "foo": "*",
  "foo //": ["should be removed in 1.x release"]
}

ความคิดเห็นที่ใช้กับการพึ่งพาเฉพาะสามารถเพิ่มเป็นส่วนหนึ่งของ semver:

"dependencies": {
  "bar": "*",
  "foo": "* || should be removed in 1.x release"
}

โปรดสังเกตว่าหากส่วนแรกก่อนหน้าORนี้ไม่ตรงกันความคิดเห็นสามารถแยกวิเคราะห์ได้เช่น1.xไม่ตรงกับความคิดเห็นสามารถแยกวิเคราะห์เช่น

วิธีแก้ไขปัญหาเหล่านี้เข้ากันได้กับรุ่น NPM ปัจจุบันทั้งหมด (6 และต่ำกว่า)


1

เนื่องจากนักพัฒนาส่วนใหญ่คุ้นเคยกับเอกสารที่ใช้แท็ก / คำอธิบายประกอบการประชุมที่ฉันเริ่มใช้จึงคล้ายกัน นี่คือรสชาติ:

{
  "@comment dependencies": [
    "These are the comments for the `dependencies` section.",
    "The name of the section being commented is included in the key after the `@comment` 'annotation'/'tag' to ensure the keys are unique.",
    "That is, using just \"@comment\" would not be sufficient to keep keys unique if you need to add another comment at the same level.",
    "Because JSON doesn't allow a multi-line string or understand a line continuation operator/character, just use an array for each line of the comment.",
    "Since this is embedded in JSON, the keys should be unique.",
    "Otherwise JSON validators, such as ones built into IDE's, will complain.",
    "Or some tools, such as running `npm install something --save`, will rewrite the `package.json` file but with duplicate keys removed.",
    "",
    "@package react - Using an `@package` 'annotation` could be how you add comments specific to particular packages."
  ],
  "dependencies": {
    ...
  },
  "scripts": {
    "@comment build": "This comment is about the build script.",
    "build": "...",

    "@comment start": [
      "This comment is about the `start` script.",
      "It is wrapped in an array to allow line formatting.",
      "When using npm, as opposed to yarn, to run the script, be sure to add ` -- ` before adding the options.",
      "",
      "@option {number} --port - The port the server should listen on."
    ],
    "start": "...",

    "@comment test": "This comment is about the test script.",
    "test": "..."
  }
}

หมายเหตุ: สำหรับส่วนdependencies,, devDependenciesฯลฯ คำอธิบายประกอบความคิดเห็นไม่สามารถเพิ่มได้โดยตรงเหนือการอ้างอิงแต่ละแพ็กเกจภายในวัตถุการกำหนดค่าเนื่องจากnpmคาดว่ากุญแจจะเป็นชื่อของแพคเกจ npm ดังนั้นเหตุผลสำหรับการ@comment dependenciesดังนั้นเหตุผลในการที่

หมายเหตุ: ในบริบทบางอย่างเช่นในวัตถุสคริปต์บรรณาธิการ / ไอดีบางคนอาจบ่นเกี่ยวกับอาเรย์ ในบริบทของสคริปต์รหัส VS คาดว่าสตริงสำหรับค่า - ไม่ใช่อาร์เรย์

ฉันชอบวิธีการใส่หมายเหตุประกอบ / แท็กสไตล์ของการเพิ่มความคิดเห็นใน JSON เนื่องจาก@สัญลักษณ์โดดเด่นจากการประกาศปกติ


1

เพื่อสรุปคำตอบทั้งหมดเหล่านี้:

  1. เพิ่มฟิลด์ระดับบนสุดเดียวชื่อ//ที่มีสตริงความคิดเห็น ใช้งานได้ แต่มันแย่เพราะคุณไม่สามารถใส่ความคิดเห็นใกล้กับสิ่งที่พวกเขาแสดงความคิดเห็น

  2. เพิ่มเขตข้อมูลระดับบนสุดหลายรายการที่ขึ้นต้นด้วย //เช่น//dependenciesที่มีสตริงความคิดเห็น สิ่งนี้ดีกว่า แต่ก็ยังให้คุณสามารถแสดงความคิดเห็นระดับบนสุดเท่านั้น คุณไม่สามารถแสดงความคิดเห็นการอ้างอิงส่วนบุคคล

  3. เพิ่มคำสั่งไปยังคุณecho scriptsใช้งานได้ แต่มันแย่เพราะคุณสามารถใช้งานได้scriptsเท่านั้น

โซลูชั่นเหล่านี้ยังไม่สามารถอ่านได้ทั้งหมด พวกเขาเพิ่มเสียงรบกวนทางสายตาและ IDE จะไม่เน้นไวยากรณ์เป็นความคิดเห็น

ฉันคิดว่าทางออกที่สมเหตุสมผลเพียงอย่างเดียวคือการสร้างpackage.jsonจากไฟล์อื่น วิธีที่ง่ายที่สุดคือการเขียนของคุณเป็น JSON Javascript package.jsonและใช้โหนดที่จะเขียนมันไป บันทึกแฟ้มนี้เป็นpackage.json.mjs, และจากนั้นคุณก็สามารถใช้มันในการสร้างของคุณchmod +xpackage.json

#!/usr/bin/env node

import { writeFileSync } from "fs";

const config = {
  // TODO: Think of better name.
  name: "foo",
  dependencies: {
    // Bar 2.0 does not work due to bug 12345.
    bar: "^1.2.0",
  },
  // Look at these beautify comments. Perfectly syntax highlighted, you
  // can put them anywhere and there no risk of some tool removing them.
};

writeFileSync("package.json", JSON.stringify({
    "//": "This file is \x40generated from package.json.mjs; do not edit.",
    ...config
  }, null, 2));

มันใช้//กุญแจเพื่อเตือนผู้คนจากการแก้ไขมัน \x40generatedมีเจตนา มันจะกลายเป็น@generatedในpackage.jsonและหมายความว่าบางระบบการตรวจสอบรหัสจะยุบไฟล์ที่เริ่มต้น

มันเป็นขั้นตอนพิเศษในระบบการสร้างของคุณ แต่มันจะเอาชนะแฮ็กอื่นทั้งหมดที่นี่


0

เนื่องจากคีย์ความคิดเห็นที่ซ้ำกันจะถูกลบออกโดยใช้เครื่องมือ package.json (npm, ไหมพรม, ฯลฯ ) ฉันมาใช้รุ่นแฮชซึ่งช่วยให้อ่านได้ดีขึ้นเป็นหลายบรรทัดและปุ่มเช่น

"//": {
  "alpaca": "we use the bootstrap version",
  "eonasdan-bootstrap-datetimepicker": "instead of bootstrap-datetimepicker",
  "moment-with-locales": "is part of moment"
},

ซึ่ง 'ถูกต้อง' ตาม IDE ของฉันเป็นรูตคีย์ แต่ภายในdependenciesมันบ่นว่าต้องการค่าสตริง


ใช่ b / c คุณทำไม่ได้จริง ๆ แต่เป็น//กุญแจสำคัญในทุกที่มันไม่ได้เป็นสิ่งที่ดีสำหรับความคิดเห็นโดยเฉพาะเมื่อความคิดเห็นสามารถมีไวยากรณ์ที่ดีซึ่งเน้นด้วยเครื่องมือแก้ไข ฯลฯ
Alexander Alexander

0

แฮ็คอื่น ฉันสร้างสคริปต์เพื่ออ่านpackage.jsonเป็นบริบทสำหรับเทมเพลตแฮนด์บาร์

รหัสด้านล่างในกรณีที่มีคนพบวิธีนี้มีประโยชน์:

const templateData = require('../package.json');
const Handlebars = require('handlebars');
const fs = require('fs-extra');
const outputPath = __dirname + '/../package-json-comments.md';
const srcTemplatePath = __dirname + '/package-json-comments/package-json-comments.hbs';

Handlebars.registerHelper('objlist', function() {
  // first arg is object, list is a set of keys for that obj
  const obj = arguments[0];
  const list = Array.prototype.slice.call(arguments, 1).slice(0,-1);

  const mdList = list.map(function(k) {
    return '* ' + k + ': ' + obj[k];
  });

  return new Handlebars.SafeString(mdList.join("\n"));
});

fs.readFile(srcTemplatePath, 'utf8', function(err, srcTemplate){
  if (err) throw err;
  const template = Handlebars.compile(srcTemplate);
  const content = template(templateData);

  fs.writeFile(outputPath, content, function(err) {
    if (err) throw err;
  });
});

ไฟล์เทมเพลต handlebars package-json-comments.hbs

### Dependency Comments
For package: {{ name }}: {{version}}

#### Current Core Packages
should be safe to update
{{{objlist dependencies
           "@material-ui/core"
           "@material-ui/icons"
           "@material-ui/styles"
}}}

#### Lagging Core Packages
breaks current code if updated
{{{objlist dependencies
           "amazon-cognito-identity-js"
}}}

#### Major version change
Not tested yet
{{{objlist dependencies
           "react-dev-utils"
           "react-redux"
           "react-router"
           "redux-localstorage-simple"

}}}

0

สำหรับแพ็คเกจ npm พบว่ามี 2 วิธี (หลังจากอ่านบทสนทนานี้):

  "devDependencies": {
    "del-comment": [
      "some-text"
    ],
    "del": "^5.1.0 ! inner comment",
    "envify-comment": [
      "some-text"
    ],
    "envify": "4.1.0 ! inner comment"
  }

แต่ด้วยการอัปเดตหรือติดตั้งแพคเกจใหม่ด้วย "--save" หรือ "--save-dev ความคิดเห็นเช่น" ^ 4.1.0! ความคิดเห็น "ในสถานที่ที่เกี่ยวข้องจะถูกลบและทั้งหมดนี้จะทำลายการตรวจสอบ NPM


จะไม่นี้พยายามที่จะติดตั้งแพคเกจชื่อdel-commentและenvify-comment?
Beni Cherniavsky-Paskin

-1

ฉันรู้สึกหงุดหงิดที่ไม่มีความคิดเห็นใน JSON ฉันสร้างโหนดใหม่ชื่อสำหรับโหนดที่อ้างถึง แต่นำหน้าด้วยขีดล่าง สิ่งนี้ไม่สมบูรณ์ แต่ใช้งานได้

{
  "name": "myapp",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.3.2",
    "react-dom": "^16.3.2",
    "react-scripts": "1.1.4"
  },
  "scripts": {
    "__start": [
        "a note about how the start script works"
    ],
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "__proxy": [
    "A note about how proxy works",
    "multilines are easy enough to add"
  ],
  "proxy": "http://server.whatever.com:8000"
}

การใช้start_commentจะดีกว่าเพราะจะสั่งตามลำดับตัวอักษร
Alexander Mills
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.