どのようにiCloud Drive同期Xcodeの配置を利用しますか?


前言
数年前、あるベテランプログラマがコードの断片はプログラマーの財産であり、彼はUSBメモリを持っています。中には彼の財産が入っています。彼はパソコンを切り替えてコードを書くたびに、心を込めて配置されたフォント、テーマ、コードのセグメントなどを新しいコンピュータに配置し、高速エンコードを開始します。彼がコードを書くのを見るたびに楽しみですが、これはもう一つの物語です。
需要
数年後、私もやっとお金を集めて自分のMacを買いました。暇な時にもコードを書いて、過ぎ去った青春を弔います。しかし、いつも違和感を感じます。例えば、フォントと単位の間に細かい差があると感じます。あるいはコードの一部分がどうしても押されません。このようなことが多くなると、嫌になります。同じ操作をなぜ二回、三回繰り返すのですか?あるいは何年の灰を食べたUディスクを取り出して各地のコンピュータの上で人工的に同期させますか?一回で何回も変更できますか?ちょっと頭を叩いて、今日の主役のiCloud Driveを思い出しました。
1、なぜiCloud Driveを使うのですか?
これはアップルの本家のネットディスクですので、システムの中に組み込みます。アップロードに関心がなくても大丈夫です。OneDriveはWindowsにあるように、ファイルを入れたいだけです。彼は自動的にアップロードを始めます。そしてあなたのアップル設備ごとに同期します。これを利用して、Xcodeの設定ファイルを異なる設備で同期したり、ダウンロードしたりすることができます。
2、その他の代替案
GitHubなどの大型同性交友サイト
今はgitを使うのがもっと便利だと思いますが、実現するにはちょっと複雑で、能力のある友達は自分で手を動かしてもいいです。
OneDrive/ナッツ雲などのディスク
自分で持っていくものがあると思いますが、やはり持参します。
考え方
Xcodeのコードセグメントは~/Library/Developer/Xcode/UserData/CodeSnippetsのパスの下に保存されています。近くの位置にテーマなどの配置情報があります。筆者の経験に基づいて、同クラスのカタログのCodeSnippets、FontAndColorThemens、KeyBindingsの3つのサブディレクトリをバックアップするだけでいいです。コード断片、件名またはショートカットキーを修正するたびに、対応するファイルをiCloud Driveに同期させ、他のコンピュータで最新のカバーを使って対応ディレクトリに上書きすればいいです。
スクリプト
とはいえ、筆者はこの3歳の子供が分析できるようなものを出して人をごまかす勇気はないと思います。だから、この煩雑で機械的な操作を簡略化するために、私はこのようなシナリオを書きました。

#!/usr/bin/env bash

set -euo pipefail

################# variable define ##########
now=`date "+%Y%m%d%H%M%S"`

red=`tput setaf 1`
green=`tput setaf 2`
yellow=`tput setaf 3`
reset=`tput sgr0`

xcode_dir="${HOME}/Library/Developer/Xcode/UserData"
cloud_backup_dir="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/XcodeBackup"
local_backup_dir="${HOME}/  /  /XcodeBackup"

code_snippets="CodeSnippets"
font_and_color_themes="FontAndColorThemes"
key_bindings="KeyBindings"

########### MAIN ##################
# check directory exist
if [ ! -d "${cloud_backup_dir}" ]; then
 echo "${red}iCloud Drive       !${reset}"
 mkdir -p "${cloud_backup_dir}"
 echo "${green}    iCloud Drive    :${reset}${cloud_backup_dir}"
 else
 echo "${green}iCloud Drive    :${reset}${cloud_backup_dir}"
fi

if [ ! -d "${local_backup_dir}" ]; then
 echo "${red}         !${reset}"
 mkdir -p "${local_backup_dir}"
 echo "${green}          :${reset}${local_backup_dir}"
 else
 echo "${green}      :${reset}${cloud_backup_dir}"
fi

# zip files
cd "${xcode_dir}"
zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &
zip -r "${local_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &

wait

# delete unnecessary backup files
num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l`
if [ ${num} -gt 5 ]; then
 num=`expr ${num} - 5`
 cd "${cloud_backup_dir}"
 ls -tr "${cloud_backup_dir}" | head -${num} | xargs rm
fi

num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l`
if [ ${num} -gt 5 ]; then
 num=`expr ${num} - 5`
 cd "${local_backup_dir}"
 ls -tr "${local_backup_dir}" | head -${num} | xargs rm
fi
この煩雑な操作を簡略化して、起動時に走るだけで、自動バックアップの効果が得られます。機能も非常に簡単です。
  • はまず、Xcodeのプロファイルをバックアップする二つのパスを作成しました。一つはクラウドで、一つはローカルです。
  • 、Xcodeをこの二つのところに保存してください。ここではzipパッケージを選択して、より高い圧縮比の7 zipなどではなく、汎用的なものにしたいです。みんなが開けばすぐ使えるので、他のソフトを別途インストールする必要がありません。
  • は最後に何回も運行した後に発生した古いカバンを削除して、最新の5つだけを保留して、貴重な空間を節約します。
    この台本があったら、みんなでスタートを切る時に走ればいいです。毎日起動して、cocococoapps、brew、brew caskなどを更新するのが好きです。だから台本を書きました。ついでにバックアップします。脚本の構想は大体次の通りです。テーマと関係がないので詳しくは言いません。
    
    #!/usr/bin/env bash
    
    open         
    
    wait
    
    pod repo update --verbose &
      Homebrew cask &
            &
    
      Xcode IDE     &
    
    wait
    
    killall         
    でも、これはあまり便利ではありません。結局、terminalの入力コマンドを開くのが嫌になりました。このコンピュータの配置は最新のものですか?そして、雲盤の中の配置を指定の位置に解凍して上書きする必要がありますか?これらを作る前に、このコンピュータの配置を最新版として雲盤にアップロードしました。
    すべてのコンピュータに同じバージョンの配置を使わせます。
    改めて考えました。これらのファイルの最終更新日とバックアップしたファイルを比較して、誰が新しくどのバージョンを使うかを確認すれば、それは実現されるのではないでしょうか?毎回修正するたびに台本を走ります。毎回起動するたびに一回走ります。ファイルの最終修正時間をどう判断するかというと、ファイル名によって生成されたkeyと対応するファイルの最終修正時間をvalueのデータ構造と比較すればいいと思います。
    しかし、実際に操作してみて、改めて私の才能の浅はかさを明らかにしました。私もbashの中で効率的で持続的なキーの作成方法が分かりません。もしどなたかご存知でしたら、ぜひ教えてください。
    最後にMacが持っているSQLite 3を思い出しました。このような小さな機能では、データベース上では少し高い砲弾がありますが、走れればいいです。スクリプトは以下の通りです
    
    #!/usr/bin/env bash
    
    set -euo pipefail
    
    ################# variable define ##########
    now=`date "+%Y%m%d%H%M%S"`
    
    red=`tput setaf 1`
    green=`tput setaf 2`
    yellow=`tput setaf 3`
    reset=`tput sgr0`
    
    xcode_dir="${HOME}/Library/Developer/Xcode/UserData"
    cloud_backup_dir="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/XcodeBackup"
    local_backup_dir="${HOME}/  /  /XcodeBackup"
    
    xcode_backup_database="${HOME}/Library/Mobile Documents/com~apple~CloudDocs/.BackupDatabase"
    
    code_snippets="CodeSnippets"
    font_and_color_themes="FontAndColorThemes"
    key_bindings="KeyBindings"
    
    temp="DoNotModify"
    database="${xcode_backup_database}/${temp}"
    
    ########### MAIN ##################
    # check directory exist
    if [ ! -d "${cloud_backup_dir}" ]; then
     echo "${red}iCloud Drive       !${reset}"
     mkdir -p "${cloud_backup_dir}"
     echo "${green}    iCloud Drive    :${reset}${cloud_backup_dir}"
    else
     echo "${green}iCloud Drive    :${reset}${cloud_backup_dir}"
    fi
    
    if [ ! -d "${local_backup_dir}" ]; then
     echo "${red}         !${reset}"
     mkdir -p "${local_backup_dir}"
     echo "${green}          :${reset}${local_backup_dir}"
    else
     echo "${green}      :${reset}${cloud_backup_dir}"
    fi
    
    if [ ! -d "${xcode_backup_database}" ]; then
     echo "${red}          !${reset}"
     mkdir -p "${xcode_backup_database}"
     echo "${green}         :${reset}${local_backup_dir}"
    else
     echo "${green}     :${reset}${cloud_backup_dir}"
    fi
    
    sqlite3 "${database}" 'create table if not exists backupXcode(id integer primary key not NULL,key integer unique not NULL,value integer not NULL);'
    
    #        
    cd "${xcode_dir}"
    find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp}
    
    while read path; do
     key=`md5 -q -s "${path}"`
     value=`stat -f "%m" "${path}"`
     isModify=`sqlite3 "${database}" "select value from backupXcode where key == '${key}';"`
     if [ -z ${isModify} ]; then
      echo "${yellow}  Xcode      ${reset}!"
      num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l`
      if [ ${num} -ge 1 ]; then
       echo "${green}     Xcode  ,      ${reset}!"
       
       cd "${xcode_dir}"
       ## backup before
       zip -r "XcodeBackup.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &
       wait
       
       cd "${cloud_backup_dir}"
       newBackup=`ls -t | head -1`
       
       unzip -u "${newBackup}" -d "${xcode_dir}" &
       wait
       
       cd "${xcode_dir}"
       rm ${temp}
       find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp}
       echo      ...
       while read path; do
        key=`md5 -q -s "${path}"`
        value=`stat -f "%m" "${path}"`
        sqlite3 "${database}" "insert or replace into backupXcode values(NULL,'${key}',${value});" &
       done < ${temp}
      fi
      break
     fi
     if [ ${isModify} != ${value} ]; then
      if [ ${isModify} -lt ${value} ]; then
       echo "${yellow}  Xcode    ${reset}!"
      else
       echo "${yellow}  Xcode      ${reset}!"
       
       num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l`
       if [ ${num} -ge 1 ]; then
        echo "${green}     Xcode  ,      ${reset}!"
        
        cd "${xcode_dir}"
        ## backup before
        zip -r "XcodeBackup.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &
        wait
        
        cd "${cloud_backup_dir}"
        newBackup=`ls -t | head -1`
        
        unzip -o "${newBackup}" -d "${xcode_dir}" &
        wait
       fi
      fi
      cd "${xcode_dir}"
      rm ${temp}
      find "./${code_snippets}" "./${font_and_color_themes}" "./${key_bindings}" -type f >> ${temp}
      echo      ...
      while read path; do
       key=`md5 -q -s "${path}"`
       value=`stat -f "%m" "${path}"`
       sqlite3 "${database}" "insert or replace into backupXcode values(NULL,'${key}',${value});"
      done < ${temp}
      break
     fi
    done < ${temp}
    
    wait
    rm ${temp}
    
    # zip files
    cd "${xcode_dir}"
    zip -r "${cloud_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &
    zip -r "${local_backup_dir}/XcodeBackup+${now}.zip" "${code_snippets}" "${font_and_color_themes}" "${key_bindings}" &
    
    wait
    
    # delete unnecessary backup files
    num=`ls -l "${cloud_backup_dir}" |grep "^-"|wc -l`
    if [ ${num} -gt 5 ]; then
     num=`expr ${num} - 5`
     cd "${cloud_backup_dir}"
     ls -tr "${cloud_backup_dir}" | head -${num} | xargs rm
    fi
    
    num=`ls -l "${local_backup_dir}" |grep "^-"|wc -l`
    if [ ${num} -gt 5 ]; then
     num=`expr ${num} - 5`
     cd "${local_backup_dir}"
     ls -tr "${local_backup_dir}" | head -${num} | xargs rm
    fi
    後記
    簡単にテストしましたが、大体使えます。このような考え方は、Alfred、vimrcなどの配置ファイルにも使えるはずです。でも、まだそんなに便利ではありません。でも、私は才能が浅くて、今はこのレベルです。皆さんに助けてほしいです。何かいい提案がありますか?Xcodeがオフした時に自動的に本スクリプトを実行できると思いますが、まだ良い胡克点(:´)を見つけられません。何かいい提案があれば、PRを歓迎します。
    はい、以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持っています。質問があれば、メッセージを残して交流してください。ありがとうございます。