tự động cập nhật gói.j.j


183

Trước khi tôi thực hiện một bản phát hành nhỏ và gắn thẻ nó, tôi muốn cập nhật gói.json để phản ánh phiên bản mới của chương trình.

Có cách nào để chỉnh sửa tập tin package.jsontự động?

Sẽ sử dụng một git pre-release hooksự giúp đỡ?


1
Tại sao bạn không tạo tập lệnh shell để chỉnh sửa gói.json, cam kết và sau đó gắn thẻ?
gustavotkg

yeah, hook trước khi phát hành sẽ gọi kịch bản đó phải không?
tUrG0n

Câu trả lời:


94

npm versioncó lẽ là câu trả lời đúng Chỉ để đưa ra một giải pháp thay thế tôi khuyên bạn nên càu nhàu . Nó được duy trì bởi một trong những kẻ từ angular.js.

Sử dụng:

grunt bump
>> Version bumped to 0.0.2

grunt bump:patch
>> Version bumped to 0.0.3

grunt bump:minor
>> Version bumped to 0.1.0

grunt bump
>> Version bumped to 0.1.1

grunt bump:major
>> Version bumped to 1.0.0

Nếu bạn đang sử dụng grunt dù sao thì đó có thể là giải pháp đơn giản nhất.


12
Và nếu bạn đang sử dụng gulpjs : gulp-
ốp lưng

Tôi đã mã hóa Vik cho điều này, mà va chạm vào npm, Bower, v.v ... trong một cú trượt ngã: github.com/Wildhoney/Vik
Wildhoney

8
Tại sao sử dụng các thư viện bên ngoài khi npm có chức năng này được tích hợp?
linuxdan

8
Lợi ích của việc sử dụng những thứ này là npm versiongì?
Steve Bennett

3
@ConAntonakos Có. Hãy thử một cái gì đó như npm --no-git-tag-version version patch.
Tống Thần

165

Câu trả lời đúng

Để làm như vậy, chỉ cần npm version patch=)

Câu trả lời cũ của tôi

Không có pre-releasemóc ban đầu trong git. Ít nhất, man githookskhông hiển thị nó.

Ví dụ: nếu bạn đang sử dụng git-extra( https://github.com/visionmedia/git-extras ), bạn có thể sử dụng một pre-releasehook được thực hiện bởi nó, như bạn có thể thấy tại https://github.com/visionmedia/ git-ngoại vi / blob / master / bin / git-phát hành . Nó chỉ cần một .git/hook/pre-release.shtập tin thực thi mà chỉnh sửa package.jsontập tin của bạn . Cam kết, đẩy và gắn thẻ sẽ được thực hiện bằng git releaselệnh.

Nếu bạn không sử dụng bất kỳ tiện ích mở rộng nào git, bạn có thể viết tập lệnh shell (tôi sẽ đặt tên cho nó git-release.sh) và hơn bạn có thể đặt bí danh cho nó git releasevới một cái gì đó như:

git config --global alias.release '!sh path/to/pre-release.sh $1'

Bạn có thể, hơn, sử dụng git release 0.4sẽ thực thi path/to/pre-release.sh 0.4. Kịch bản của bạn có thể chỉnh sửa package.json, tạo thẻ và đẩy nó đến máy chủ.


bạn có thể chia sẻ một đoạn mã về kịch bản sẽ như thế nào không? : D
tUrG0n


tôi thực sự sử dụng repo thêm git-thêm của Visionmedia. Nhưng git releasekhông cập nhật
gói.json

Vì vậy, chỉ cần tạo .git/hooks/pre-release.shcó chứa: echo -e "{\n\"version\": "$1"\n}" > package.jsonvà thử sử dụnggit release $version
gustavotkg

5
như đã bình luận ở đây npm version patch hoặc npm version 0.3.1 sẽ giải quyết nó! Bạn có thể cập nhật câu trả lời của bạn cho phù hợp? ty !!
tUrG0n

75

Đây là những gì tôi thường làm với các dự án của mình:

npm version patch
git add *;
git commit -m "Commit message"
git push
npm publish

Dòng đầu tiên npm version patch, sẽ tăng phiên bản vá lên 1 (xx1 đến xx2) package.json. Sau đó, bạn thêm tất cả các tệp - bao gồm cả package.jsontại thời điểm đó đã được sửa đổi. Sau đó, như thường lệ git commitgit push, và cuối cùng npm publishđể công bố các mô-đun.

Tôi hy vọng điều này có ý nghĩa ...

Merc.


9
Theo như tôi có thể nói, npm version patchbản thân cam kết; tuy nhiên, để đẩy thẻ lên github, tôi nghĩ bạn cũng cần phải như vậy git push --tags.
ChrisV

@ChrisV là chính xác - npm version patchtăng số phiên bản và ngay lập tức cam kết thay đổi
Dan Esparza

2
@DanEsparza Đây có thể là một điều thiết lập. npm version patchkhông cam kết bất cứ điều gì cho tôi.
Mordred

@Mordred Hmmm ... có thể. Tôi không thấy bất cứ điều gì trong tài liệu cấu hình npm về điều đó, nhưng có thể là bạn không có git trong đường dẫn của bạn hoặc một cái gì đó?
Dan Esparza

@DanEsparza git chắc chắn nằm trong đường dẫn khi tôi cam kết từ chính thư mục tôi chạy npm version.
Mordred

28

Để đưa ra một cách tiếp cận cập nhật hơn.

package.json

  "scripts": {
    "eslint": "eslint index.js",
    "pretest": "npm install",
    "test": "npm run eslint",
    "preversion": "npm run test",
    "version": "",
    "postversion": "git push && git push --tags && npm publish"
  }

Sau đó, bạn chạy nó:

npm version minor --force -m "Some message to commit"

Mà sẽ:

  1. ... chạy thử nghiệm ...

  2. thay đổi package.jsonphiên bản nhỏ tiếp theo của bạn (ví dụ: 1.8.1 thành 1.9.0)

  3. thúc đẩy thay đổi của bạn

  4. tạo một bản phát hành thẻ git mới và

  5. xuất bản gói npm của bạn.

--forcelà thể hiện ai là ông chủ! Đùa sang một bên xem https://github.com/npm/npm/issues/8620


3
Bạn cũng có thể thêm một tập lệnh như "deploy-minor": "npm version minor --force -m \"version %s\""vậy, tất cả những gì bạn cần nhớ là npm run deploy-minor:)
Kristofor Carle

23

Ngoài ra, npm versionbạn có thể sử dụng --no-git-tag-versioncờ nếu bạn muốn có phiên bản gập nhưng không có thẻ hoặc cam kết mới:

npm --no-git-tag-version version patch

https://docs.npmjs.com/cli/version


17

Nếu bạn đang sử dụng sợi, bạn có thể sử dụng

yarn version --patch

Điều này sẽ tăng package.jsonphiên bản bằng cách vá (0.0.x), cam kết và gắn thẻ với định dạngv0.0.0

Tương tự như vậy, bạn có thể tăng phiên bản nhỏ hoặc chính bằng cách sử dụng --minorhoặc--major

Khi đẩy sang git, đảm bảo bạn cũng đẩy các thẻ bằng --follow-tags

git push --follow-tags

Bạn cũng có thể tạo một kịch bản cho nó

    "release-it": "yarn version --patch && git push --follow-tags"

Đơn giản chỉ cần chạy nó bằng cách gõ yarn release-it


11

Tôi đang sử dụng huskygit-chi nhánh-là :

Kể từ husky v1 +:

// package.json
{
  "husky": {
    "hooks": {
      "post-merge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
    }
  }
}

Trước khàn khàn V1:

"scripts": {
  ...
  "postmerge": "(git-branch-is master && npm version minor || 
  (git-branch-is dev && npm --no-git-tag-version version patch)",
  ...
},

Tìm hiểu thêm về phiên bản npm

Webpack hoặc Vue.js

Nếu bạn đang sử dụng webpack hoặc Vue.js, bạn có thể hiển thị thông tin này trong Giao diện người dùng bằng phiên bản Tự động tiêm - Trình cắm Webpack

NUXT

Trong nuxt.config.js:

var WebpackAutoInject = require('webpack-auto-inject-version');

module.exports = {
  build: {
    plugins: [
      new WebpackAutoInject({
        // options
        // example:
        components: {
          InjectAsComment: false
        },
      }),
    ]
  },
}

Bên trong templateví dụ của bạn trong phần chân trang:

<p> All rights reserved © 2018 [v[AIV]{version}[/AIV]]</p>

Tôi thích tùy chọn khàn khàn này là tốt nhất, mặc dù tôi không nghĩ nó còn hoạt động nữa. Tôi không nghĩ rằng 'postmerge' tồn tại, "pre-push" có lẽ là lựa chọn tốt nhất. và kết quả 'git-chi nhánh-là' không thực sự hoạt động vì chúng bị lỗi và về cơ bản làm hỏng toàn bộ bài đăng (vì nó kiểm tra cả chủ và dev, nó sẽ báo lỗi cho một trong số chúng)
Phil

@Phil Bạn vẫn có thể sử dụng postmerge, nhưng giờ nó đã post-mergeở trong husky: {hooks:{}}cấu hình. Bạn có vấn đề gì với git-branch-is?
Anima-t3d

nó sẽ chỉ lỗi cho tôi thay vì chạy. Mặc dù vậy, không phải lo lắng, cuối cùng tôi đã đi với tùy chọn này: marketplace.visualstudio.com/ Khăn
Phil

1
@Phil cảm ơn đã theo dõi. Tôi vừa thử với phiên bản cập nhật và tôi không có lỗi, có lẽ có gì đó không ổn với chính lệnh sau hợp nhất của bạn.
Anima-t3d

5

Tôi muốn thêm một số sự rõ ràng cho câu trả lời câu hỏi này.

Thậm chí nghĩ rằng có một số câu trả lời ở đây đang giải quyết đúng vấn đề và đưa ra giải pháp, chúng không phải là câu trả lời đúng. Câu trả lời đúng cho câu hỏi này là sử dụngnpm version

Có cách nào để tự động chỉnh sửa tệp pack.json không?

Vâng, những gì bạn có thể làm để thực hiện điều này là chạy npm versionlệnh khi cần, bạn có thể đọc thêm về nó ở đây phiên bản npm , nhưng việc sử dụng cơ sở sẽ là npm version patchvà nó sẽ thêm thứ tự chữ số 3 trên package.jsonphiên bản của bạn (1.0. X )

Sẽ sử dụng một git móc phát hành trước giúp đỡ?

Bạn có thể định cấu hình để chạy npm versionlệnh trên hook trước khi phát hành, khi bạn cần, nhưng điều đó phụ thuộc vào việc đó có phải là thứ bạn cần hay không trong ống CD / CI của bạn, nhưng không có npm versionlệnh thì git pre-releasehook không thể làm bất cứ điều gì "dễ dàng" vớipackage.json

Lý do tại sao npm versioncâu trả lời đúng là như sau:

  1. Nếu người dùng đang sử dụng cấu trúc thư mục mà anh package.jsonta đang sử dụng npmnếu anh ta đang sử dụng npmthì anh ta có quyền truy cập vào npm scripts.
  2. Nếu anh ta có quyền truy cập npm scripts, anh ta có quyền truy cập vào npm versionlệnh.
  3. Sử dụng lệnh này, anh ta không cần phải cài đặt thêm bất cứ thứ gì trong máy tính hoặc ống CD / CI, về lâu dài sẽ làm giảm nỗ lực bảo trì cho dự án và sẽ giúp thiết lập

Các câu trả lời khác trong đó các công cụ khác được đề xuất là không chính xác.

gulp-bump hoạt động nhưng yêu cầu một gói bổ sung khác có thể tạo ra các vấn đề trong dài hạn (điểm 3 trong câu trả lời của tôi)

grunt-bump hoạt động nhưng yêu cầu một gói bổ sung khác có thể tạo ra các vấn đề trong dài hạn (điểm 3 trong câu trả lời của tôi)


2

Trước tiên, bạn cần hiểu các quy tắc để nâng cấp số phiên bản. Bạn có thể đọc thêm về phiên bản ngữ nghĩa ở đây.

Mỗi phiên bản sẽ có phiên bản xyz nơi nó xác định cho các mục đích khác nhau như được hiển thị bên dưới.

  1. x - chính, lên điều này khi bạn có những thay đổi lớn và đó là sự khác biệt lớn của những thay đổi xảy ra.
  2. y - nhỏ, lên điều này khi bạn có chức năng hoặc cải tiến mới xảy ra.
  3. z - patch, lên bản này khi bạn sửa lỗi hoặc hoàn nguyên các thay đổi trên phiên bản trước.

Để chạy các tập lệnh, bạn có thể định nghĩa nó trong gói.json.

"script": {
    "buildmajor": "npm version major && ng build --prod",
    "buildminor": "npm version minor && ng build --prod",
    "buildpatch": "npm version patch && ng build --prod"
}

Trong thiết bị đầu cuối của bạn, bạn chỉ cần chạy npm theo nhu cầu của bạn như

npm run buildpatch

Nếu chạy nó trong git repo, phiên bản git-tag mặc định là đúng và nếu bạn không muốn làm như vậy, bạn có thể thêm lệnh bên dưới vào tập lệnh của mình:

--no-git-tag-version

ví dụ: "npm --no-git-tag-version version major && ng build --prod"


0

Tôi đã tạo ra một công cụ có thể thực hiện phiên bản ngữ nghĩa tự động dựa trên các thẻ trong thông điệp cam kết, được gọi là các loại thay đổi. Điều này theo sát Công ước Thông điệp Cam kết cùng với Đặc tả Phiên bản ngữ nghĩa.

Bạn có thể sử dụng công cụ này để tự động thay đổi phiên bản trong gói.json bằng cách sử dụng CLI npm (điều này được mô tả ở đây ).

Ngoài ra, nó có thể tạo ra một thay đổi từ các cam kết này và cũng có một menu (với trình kiểm tra chính tả cho các thông điệp cam kết) để tạo các cam kết dựa trên loại thay đổi. Tôi đặc biệt khuyên bạn nên kiểm tra và đọc tài liệu để xem mọi thứ có thể được thực hiện với nó.

Tôi đã viết công cụ này vì tôi không thể tìm thấy bất cứ điều gì phù hợp với nhu cầu của mình cho Đường ống CICD của tôi để tự động hóa phiên bản ngữ nghĩa. Tôi muốn tập trung vào những thay đổi thực tế hơn là phiên bản nên là gì và đó là nơi công cụ của tôi tiết kiệm trong ngày.

Để biết thêm thông tin về lý do cho công cụ, xin vui lòng xem điều này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.