aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

npm ci và npm install: chọn theo cách quản lý lockfile của nhóm

Suong Nguyen by Suong Nguyen
24/10/2026
in Đánh giá
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một pull request sửa package.json nhưng quên cập nhật lockfile. Máy developer vẫn chạy được, còn CI dừng ngay ở bước cài dependency. Trước khi thay lệnh CI để pipeline xanh trở lại, bạn cần biết sự khác nhau đó đang bảo vệ điều gì.

Bài này đánh giá hai lệnh theo hành vi cài đặt, không đưa ra benchmark tốc độ. Fixture offline được chạy với Node.js 24.18.1 và npm 11.16.0. Nguồn là tài liệu nhánh npm v11, đọc ngày 24/10/2026; đó không phải cam kết mọi phiên bản npm có output giống hệt.

1. Hai lệnh phục vụ hai thời điểm khác nhau

Theo tài liệu npm ci, lệnh cần lockfile có sẵn, từ chối khi dependency trong manifest không khớp lockfile, và cài toàn bộ dự án. Nó thay thế node_modules đang có và không ghi lại manifest hay lockfile.

Theo tài liệu npm install, install có thể dùng phiên bản trong lockfile khi chúng phù hợp yêu cầu. Khi yêu cầu thay đổi, nó có thể giải quyết lại và cập nhật lockfile. Vì vậy, nói install “luôn lấy bản mới nhất” là mô tả thiếu chính xác.

Lockfile cần được review và đưa vào Git. Tài liệu package-lock.json mô tả vai trò ghi lại cây dependency. Việc có file này không thay thế kiểm thử ứng dụng, kiểm tra lifecycle script hay lựa chọn môi trường build.

2. Thử một tình huống lệch lockfile không cần registry

Tạo một thư mục thử mới, không dùng dự án đang làm. Các file bên dưới không có script cài đặt và không tải package bên ngoài.

mkdir npm-lock-demo
cd npm-lock-demo
printf '%s\n' '{"name":"npm-lock-demo","version":"1.0.0","private":true}' > package.json
npm install --package-lock-only --offline --ignore-scripts --no-audit --no-fund
npm ci --offline --ignore-scripts --no-audit --no-fund

mkdir fixture-package
printf '%s\n' '{"name":"fixture-package","version":"1.0.0"}' > fixture-package/package.json
node -e 'const fs=require("node:fs");const p=JSON.parse(fs.readFileSync("package.json","utf8"));p.dependencies={"fixture-package":"file:./fixture-package"};fs.writeFileSync("package.json",JSON.stringify(p,null,2)+"\n")'

npm ci --offline --ignore-scripts --no-audit --no-fund

Lệnh ci cuối được kỳ vọng thất bại: dependency local đã có trong manifest nhưng chưa có trong lockfile. Đó là lỗi cố ý của bài học. Trên bộ phiên bản đã chạy, ci báo thiếu package trong lockfile và không đổi hash lockfile.

Sau khi xem lỗi, giải quyết sự không khớp bằng một lần install có chủ đích, rồi kiểm tra ci lại:

npm install --offline --ignore-scripts --no-audit --no-fund
npm ci --offline --ignore-scripts --no-audit --no-fund

Ở fixture này, install cập nhật lockfile và ci sau đó thành công. Dependency file: chỉ để tạo ví dụ tự đủ; bài không suy ra hành vi hiệu năng của registry, workspace phức tạp hay package native từ thử nghiệm này. Các cờ tắt script, audit và fund phục vụ phạm vi bài thử, không phải cấu hình production mặc định cho mọi dự án.

3. So sánh theo cùng tiêu chí

Về độ dễ bắt đầu, install thuận tiện khi tạo dự án và thêm dependency. Ci cần bộ manifest cùng lockfile đã thống nhất, nên phù hợp lúc nhận một trạng thái dự án đã được commit để kiểm tra.

Về quyền kiểm soát, install cho phép cập nhật dependency ở bước phát triển; diff lockfile là đầu ra cần review. Ci đặt một điểm chặn: pipeline không tự chữa manifest lệch bằng cách viết lockfile mới. Nếu lỗi xuất hiện trong CI, người sửa dependency cần hoàn thiện thay đổi trong pull request.

Về hệ sinh thái, cả hai nằm trong npm và dùng cùng dự án Node. Nhưng phiên bản npm, hệ điều hành, dependency tùy chọn và cấu hình giải quyết cây vẫn cần được quản lý. Tài liệu ci lưu ý các cờ ảnh hưởng cây như legacy-peer-deps hoặc install-links phải nhất quán với lúc tạo lockfile. Nếu nhóm cần một cấu hình, ghi nó ở mức dự án theo chính sách của nhóm thay vì mỗi người tự nhớ.

Về hiệu năng, bài này không có số đo để xếp hạng. Muốn so sánh thời gian CI, hãy cố định runner, phiên bản công cụ, tình trạng cache và package tree. Đo nhiều lần và giữ log; không dùng fixture rỗng ở trên để kết luận lệnh nào nhanh hơn trong repository thật.

Về chi phí vận hành, ci làm lỗi dependency lộ sớm nhưng nhóm phải xử lý chúng đúng nơi. Install thuận tiện cho thay đổi có chủ đích nhưng cần người review diff. Cả hai đều không tự chứng minh dependency an toàn hoặc ứng dụng còn hoạt động.

Kiểm tra trong repository thật

Ở máy phát triển, thay dependency bằng install, review package.json và lockfile, rồi chạy kiểm thử liên quan. Trước khi gửi pull request, thử ci trong checkout sạch. Ở CI, chọn phiên bản Node/npm rõ ràng, chạy ci rồi đến build/test.

Nếu ci lỗi, kiểm tra manifest và lockfile có cùng commit không, lockfile có được bỏ qua trong checkout không, và cấu hình tạo cây có giống local không. Đừng xóa lockfile chỉ để dập lỗi; bạn sẽ mất một phần thông tin cần điều tra. Cũng đừng coi --ignore-scripts là cách sửa mọi package lỗi build: một số dependency cần script để hoạt động.

Kết luận

Dùng install cho bước thay đổi dependency có review và dùng ci để kiểm tra một trạng thái dependency đã thống nhất là một lựa chọn rõ ràng cho nhiều nhóm. Quyết định nên dựa trên quy trình lockfile và bằng chứng build của dự án, không chỉ tên lệnh hay lời hứa tốc độ.

Nguồn tham khảo

  • npm v11: npm ci
  • npm v11: npm install
  • npm v11: package-lock.json

Tags: CI/CDDependencynpm
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

Node test runner hay Vitest: chọn theo cách dự án chạy code

by Suong Nguyen
23/10/2026
0

So sánh test runner tích hợp Node.js và Vitest theo module, TypeScript, mock và chi phí vận hành thay vì suy đoán tốc độ.

Minh họa kiến trúc backend API gọn gàng cho sản phẩm nhỏ

SQLite FTS5 hay PostgreSQL full-text search cho tìm kiếm nội bộ?

by Suong Nguyen
22/10/2026
0

So sánh hai hướng tìm kiếm theo nơi lưu dữ liệu, đồng bộ chỉ mục và nhu cầu tiếng Việt, trước khi thêm một search service riêng.

Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Expo Go và development build: khi nào dự án nên chuyển?

by Suong Nguyen
21/10/2026
0

So sánh Expo Go và development build theo khả năng dùng native module, công sức thiết lập và độ sát với ứng dụng dự kiến phát hành.

Minh họa so sánh React Native và Flutter cho phát triển mobile

React Native hay Flutter: chọn gì cho sản phẩm mới?

by admin
02/07/2026
0

React Native và Flutter đều mạnh cho mobile cross-platform, nhưng phù hợp với những kiểu team và sản phẩm khác nhau.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native useWindowDimensions: layout đổi chiều và vẫn đọc được chữ lớn
  • Promise.all và allSettled: chờ kết quả không có nghĩa là tự hủy tác vụ
  • Android SavedStateHandle: giữ bộ lọc khi process bị hệ thống tạo lại

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply