Làm cách nào để tự động cập nhật trình soạn thảo Atom?


51

Tự động cập nhật tính năng Atom chưa được hỗ trợ cho Ubuntu. Từ kho GitHub của họ:

Hiện tại chỉ có phiên bản 64 bit.

Tải xuống Atom-amd64.deb từ trang phát hành Atom. Chạy sudo dpkg --install atom-amd64.deb trên gói đã tải xuống. Khởi chạy Atom bằng lệnh nguyên tử được cài đặt. Phiên bản Linux hiện không tự động cập nhật, do đó bạn sẽ cần lặp lại các bước này để nâng cấp lên các bản phát hành trong tương lai.

Tôi đã thử sử dụng Webupd8 PPA nhưng nó không hoạt động với tôi.


1
Vấn đề với PPA là gì?
AB

@AB Tôi nghĩ bây giờ vẫn ổn, đã không có thời gian để kiểm tra và bây giờ tôi không sử dụng nguyên tử, nhưng sau đó PPA đã không cập nhật phiên bản của tôi.
Igor V.

Tôi có lẽ không nên trả lời các câu hỏi cũ. : \
AB

1
Câu trả lời của bạn rất hay và nó sẽ giúp tôi cho những vấn đề tương tự. :)
Igor V.

Câu trả lời:


71

TL; DR Nếu bạn không muốn sử dụng PPA , bạn có thể sử dụng tập lệnh để tải xuống và tự động cài đặt qua cron.


  1. Tạo một tập tin mới atom-auto-update

    sudo nano /usr/local/bin/atom-auto-update
    
  2. Thêm các dòng sau

    #!/bin/bash
    wget -q https://github.com/atom/atom/releases/latest -O /tmp/latest
    wget -q $(awk -F '[<>]' '/href=".*atom-amd64.deb/ {match($0,"href=\"(.*.deb)\"",a); print "https://github.com/" a[1]} ' /tmp/latest) -O /tmp/atom-amd64.deb
    dpkg -i /tmp/atom-amd64.deb
    
  3. Lưu tệp và làm cho nó thực thi

    sudo chmod +x /usr/local/bin/atom-auto-update
    
  4. Kiểm tra kịch bản

    sudo atom-auto-update
    
  5. Tạo một cronjob cho kịch bản

    sudo crontab -e
    
  6. Thêm dòng này

    ví dụ: vào lúc 10 giờ sáng mỗi tuần

    0 10 * * 1 /usr/local/bin/atom-auto-update
    

    ví dụ: lúc 10 giờ sáng mỗi ngày

    0 10 * * * /usr/local/bin/atom-auto-update      
    

Giải trình

  • wget -q https://github.com/atom/atom/releases/latest -O /tmp/latest

    Tải xuống trang web với thông tin phiên bản mới nhất

  • wget -q $(awk -F '[<>]' '/href=".*atom-amd64.deb/ {match($0,"href=\"(.*.deb)\"",a); print "https://github.com/" a[1]} ' /tmp/latest) -O /tmp/atom-amd64.deb

    1. … awk -F '[<>]' '/href=".*atom-amd64.deb/ {match($0,"href=\"(.*.deb)\"",a); print "https://github.com/" a[1]} ' /tmp/latest …

      Trích xuất liên kết tải xuống

    2. wget -q $( … ) -O /tmp/atom-amd64.deb

      Tải xuống tệp DEB

  • dpkg -i /tmp/atom-amd64.deb

    Cài đặt tệp DEB


1
Một chỉnh sửa upvote! ;-)
Fabby

2
awk: dòng 1: lỗi cú pháp tại hoặc gần, wget: URL manquante Sử dụng: wget [TÙY CHỌN] ... [URL] ...
Rachid Oussanaa

Nếu tôi cập nhật theo cách này, tôi có phải đặt lại các gói không?
vẫy gọi

1
Điều này cũng cho tôi một lỗi cú pháp khi bạn thử trích xuất URL từ HTML. Có lẽ họ đã thay đổi HTML kể từ đó. Điều này làm việc cho tôi (không hoàn thành):cat /tmp/latest | grep '.deb' | grep 'href=' | cut -d '"' -f 2
Dean Thay

2
Đối với những người phải đối mặt với lỗi cú pháp awk, đây là hàng thứ ba của tôi:wget https://github.com$(cat /tmp/latest | grep -o -E 'href=".*atom-amd64.deb' | cut -d'"' -f2) -O /tmp/atom-amd64.deb
Felipe Elia

20

Câu trả lời của AB là một giải pháp tốt đẹp! Tôi đã thêm tùy chọn thanh tiến trình hiển thị trong mã bash để thông báo tiến trình: 

#!/bin/bash
wget -q https://github.com/atom/atom/releases/latest -O /tmp/latest
wget --progress=bar -q 'https://github.com'$(cat /tmp/latest | grep -o -E 'href="([^"#]+)atom-amd64.deb"' | cut -d'"' -f2 | sort | uniq) -O /tmp/atom-amd64.deb -q --show-progress
dpkg -i /tmp/atom-amd64.deb

6

Như câu trả lời trước với sửa đổi nhỏ, để cho phép cập nhật khi khởi động, đây là quy trình

  1. Tạo tập tin bằng cách chạy lệnh:

    sudo nano /usr/local/bin/atom-update  
    

sau đó nhập tập lệnh bên dưới (sử dụng trình soạn thảo văn bản như "gedit" hoặc "mousepad" thay vì "nano" để thuận tiện hơn) và sau đó lưu nó.

#!/bin/bash    
wget -q https://github.com/atom/atom/releases/latest -O /tmp/latest
MATCHEDROW=$(awk -F '[<>]' '/href=".*atom-amd64.deb/' /tmp/latest)
LATEST=$(echo $MATCHEDROW | grep -o -P '(?<=href=").*(?=" rel)')
VER_LATEST=$(echo $MATCHEDROW | rev | cut -d"/" -f 2 | rev | sed 's/v//g')
VER_INST=$(dpkg -l atom | tail -n1 | tr -s ' ' | cut -d" " -f 3)

if [ "$VER_LATEST" != "$VER_INST" ]; then
   wget --progress=bar -q "https://github.com/$LATEST" -O /tmp/atom-amd64.deb --show-progress
   dpkg -i /tmp/atom-amd64.deb
   echo "Atom has been update from $VER_LATEST to $VER_INST"
   logger -t atom-update "Atom has been update from $VER_INST to $VER_LATEST"
else
   echo "Atom version $VER_INST is the latest version, no update require"
   logger -t atom-update "Atom version $VER_INST is the latest version, no update require"
fi
  1. Để làm cho tập tin thực thi:

    sudo chmod +x /usr/local/bin/atom-update
    
  2. Bây giờ bạn có thể cập nhật thủ công Atom bằng cách gõ lệnh:

    sudo atom-update
    
  3. Đăng nhập vào thư mục gốc của bạn, rồi thêm hàng bên dưới vào /etc/rc.local ( sudo nano /etc/rc.local) ngay trước exit 0lệnh:

    /usr/local/bin/atom-update  
    

Điều này sẽ cho phép tập lệnh cập nhật nguyên tử thực thi mỗi khi bạn bật PC.

  1. Để kiểm tra xem tập lệnh đã chạy đúng khi khởi động chưa, hãy khởi động lại PC của bạn và mở terminal sau đó gõ:

    cat /var/log/syslog | grep 'atom.*'  
    

Bạn sẽ thấy thông điệp tường trình phù hợp.


Nó không hoạt động nữa. Bạn có thể cập nhật nó được không?
Thú vị Knox

Tôi bối rối nếu điều này thực sự nâng cấp Atom của tôi, tôi nhận được Atom đã được cập nhật từ 1.23.3 lên 1.19.7 . Nếu tôi tải xuống bản mới nhất hiện tại từ Atom.iosudo dpkg -i atom-amd64.debsau đó tôi nhận được `Giải nén nguyên tử (1.23.3) qua (1.19.7).
Pablo A

3

Dựa trên câu trả lời của AB , tôi đã thêm kiểm tra phiên bản để tránh tải xuống / cài đặt không cần thiết:

#!/bin/bash

TMP_DIR=$(mktemp -d)

TMP_LATEST="${TMP_DIR}/latest"
TMP_FILE="${TMP_DIR}/atom-amd64.deb"

wget -q https://github.com/atom/atom/releases/latest -O ${TMP_LATEST}
LATEST=$(awk -F '[<>]' '/href=".*atom-amd64.deb/ {match($0,"href=\"(.*.deb)\"",a); print "https://github.com/" a[1]} ' ${TMP_LATEST})
VER_LATEST=$(echo $LATEST | rev | cut -d"/" -f 2 | rev | sed 's/v//g')

VER_INST=$(dpkg -l atom | tail -n1 | tr -s ' ' | cut -d" " -f 3)

if [ "$VER_LATEST" != "$VER_INST" ]; then
  wget -q $LATEST -O $TMP_FILE
  VER_DOWN=$(dpkg-deb -f $TMP_FILE Version)
  if [ "$VER_DOWN" != "$VER_INST" ]; then
    dpkg -i $TMP_FILE
  fi
fi

rm -rf "${TMP_DIR}"

Chỉnh sửa: Tôi nên làm rõ rằng điều này sẽ thay thế nội dung của tập lệnh / usr / local / bin / nguyên tử tự động cập nhật mà câu trả lời của AB đề cập. Các bước khác của câu trả lời là như nhau.


3

Chà, một phiên bản khác thanh lịch hơn với sự hỗ trợ của nhánh beta, nếu tập lệnh được khởi chạy với đối số beta: $ update-atom beta

#!/bin/bash
DLPATH="https://atom.io/download/deb"
DLDEST="$HOME/Downloads/atom-amd64.deb"

if ! [ -z "$1" ] && [ $1=="beta" ];  then
  echo "Updating beta"
  DLPATH="$DLPATH?channel=beta"
  DLDEST="$HOME/Downloads/atom-amd64-beta.deb"
else
  echo "Updating stable"
fi

rm -f $DLDEST
wget -O $DLDEST $DLPATH 
sudo dpkg -i $DLDEST

2

Cài đặt Atom qua snap sẽ đảm bảo bạn luôn có phiên bản mới nhất:

sudo snap install atom --classic

Có sự khác biệt về hiệu suất hoặc cách sử dụng giữa các nguyên tử được cài đặt thông qua snap hoặc apt không? Tôi không thực sự hiểu làm thế nào để chọn cái này hay cái khác nói chung. Cảm ơn.
Ramon Suarez

1
Tôi đã sử dụng nó như thế này trong một thời gian dài mà không có vấn đề gì, tôi thích nó hơn cho các cuộc tranh luận của họ vì nó tự động thay vì nhắc nhở tôi cập nhật mọi lúc.
Jorge Castro

1

Tôi đã viết một tập lệnh Python có thể được sử dụng để cập nhật gói DEB 64 bit từ GitHub. Bạn có thể lưu nội dung sau dưới dạng update-atom, ví dụ như trong /etc/cron.hourlyhoặc /etc/cron.daily:

#!/usr/bin/env python

import os
import requests


def msg(text):
    """Give message to user."""
    os.system('notify-send "Atom updater" "{}"'.format(text))


def current():
    """Get current version."""
    f = os.popen("apt show atom 2>/dev/null | grep Ver")
    return f.read().split(' ')[1].strip()


def latest():
    """Get latest version."""
    upd_url = 'https://github.com/atom/atom/releases/latest'
    final = requests.get(upd_url).url
    return final.split('tag/v')[1]


def compare(cv, lv):
    """Compare versions."""
    return lv.split('.') > cv.split('.')


def upgrade(version):
    """Perform upgrade."""
    tempfile = '/tmp/atom.deb'
    url = (
        'https://github.com/atom/atom/releases/download/'
        'v{}/atom-amd64.deb'.format(version)
    )
    code = os.system(
        'rm -f {} && '
        'wget "{}" -O {} && '
        'dpkg -i {}'.format(tempfile, url, tempfile, tempfile)
    )
    return code == 0

if __name__ == '__main__':
    cv = current()
    try:
        lv = latest()
    except requests.exceptions.ConnectionError:
        print 'No network'
        exit(0)
    print 'Current version', cv
    print 'Latest version', lv
    result = compare(cv, lv)
    if result:
        print 'A new version is available!'
        msg('Updating Atom to version {}...'.format(lv))
        if upgrade(lv):
            msg('Update completed.')
        else:
            msg('Problem during update.')
    else:
        print 'Atom is updated.'

1

Đối với cách tiếp cận ít cụ thể hơn của Ubuntu, tôi đã viết một gói nguyên tử nhỏ để kiểm tra các phiên bản mới khi khởi động (hoặc bạn có thể kiểm tra thủ công bằng một lệnh tiện dụng trong Atom).

Đó là nền tảng độc lập (vì vậy nó hoạt động trên mọi bản phân phối linux, windows, v.v.).

Bạn có thể định cấu hình một số thứ như chỉ giám sát kênh ổn định hoặc beta, có thông báo, loại nào và nếu chúng có thể bị loại bỏ, v.v ...).

không (ít nhất là bây giờ!) Tự động cập nhật gói. Tôi có thể thêm tính năng đó trong tương lai nếu có đủ sự quan tâm đến nó.

Phản hồi chào mừng, tốt nhất là vé trên github.


Gợi ý cho thay đổi trang GitHub của bạn: dưới Cách sử dụng tiêu đề thay thế The package check for new version of Atom at launchvới The package checks for a new version of Atom at launchTheo Tại sao "geiger"? tiêu đề thay thế outadet Atombằngoutdated Atom
karel

@karel - Cảm ơn bạn, đã xong . Một số lỗi là do lỗi này . :)
mac

0

Nếu bạn đang xây dựng từ các nguồn, tôi thực hiện điều này thông qua một tập lệnh nhỏ:

cd "/home/YOUR_USER/gitmisc/atom/"
git pull
cd script/
sudo ./build --install                   


0

Một vài mod cho kịch bản python của Andrea Lazzarotto để loại bỏ sự phụ thuộc vào thông báo-gửi mà các biến thể Ubuntu khác không có theo mặc định và xử lý trường hợp chưa có bản sao nguyên tử được cài đặt. Ngoài ra, cần lưu ý rằng có những phụ thuộc khác bạn cũng sẽ cần:

sudo apt-get cài đặt python-request git gvfs-bin

Tôi cũng đã phải chạy như sau để có được một số phụ thuộc khác ...

cài đặt sudo apt-get -f

#!/usr/bin/env python
import os
import requests

def msg(text):
  """Give message to user."""
  os.system('notify-send "Atom updater" "{}"'.format(text)
  + ' 2>/dev/null '
  +'|| echo "{}"'.format(text))

def current():
    """Get current version."""
    f = os.popen("apt show atom 2>/dev/null | grep Ver")
    result = f.read()
    if result:
      return result.split(' ')[1].strip()
    return "0.0"

def latest():
    """Get latest version."""
    upd_url = 'https://github.com/atom/atom/releases/latest'
    final = requests.get(upd_url).url
    return final.split('tag/v')[1]

def compare(cv, lv):
    """Compare versions."""
    return lv.split('.') > cv.split('.')

def upgrade(version):
    """Perform upgrade."""
    tempfile = '/tmp/atom.deb'
    url = (
        'https://github.com/atom/atom/releases/download/'
        'v{}/atom-amd64.deb'.format(version)
    )
    code = os.system(
        'rm -f {} && '
        'wget "{}" -O {} && '
        'dpkg -i {}'.format(tempfile, url, tempfile, tempfile)
    )
    return code == 0

if __name__ == '__main__':
    cv = current()
    try:
        lv = latest()
    except requests.exceptions.ConnectionError:
        print 'No network'
        exit(0)
    print 'Current version', cv
    print 'Latest version', lv
    result = compare(cv, lv)
    if result:
        print 'A new version is available!'
        msg('Updating Atom to version {}...'.format(lv))
        if upgrade(lv):
            msg('Update completed.')
        else:
            msg('Problem during update.')
    else:
        msg('Atom is updated.')

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.