การโยกย้ายมีสองส่วน: ฐานข้อมูลและไฟล์สแตติก
ส่วนที่สำคัญที่สุดคือฐานข้อมูล คุณจะต้องสำรองฐานข้อมูล (aka ตร.ว
) ของฐานข้อมูลการผลิต และคุณจะต้องนำเข้าข้อมูลนั้นไปยังฐานข้อมูลในเครื่องของคุณมีหลายวิธีในการดำเนินการนี้ ขึ้นอยู่กับการโฮสต์เว็บไซต์ของคุณและคุณสามารถใช้งานได้หรือไม่ หยด
.
ไซต์ในเครื่องควรใช้งานได้บ้างหลังจากนำเข้าฐานข้อมูล แต่อาจดูแปลกหากไม่มีเนื้อหาคงที่ เช่น ไฟล์รูปภาพ ขึ้นอยู่กับวิธีการกำหนดค่าไซต์ที่ใช้งานจริง คุณอาจพบสิ่งเหล่านี้ส่วนใหญ่ในไดเร็กทอรีไฟล์สาธารณะ ตำแหน่งที่พบมากที่สุดสำหรับไฟล์เหล่านี้คือ ./web/sites/default/files
แต่เส้นทางอาจแตกต่างกัน คุณจะต้องคัดลอกไฟล์เหล่านี้จากโฮสต์เว็บที่ใช้งานจริงไปยังสภาพแวดล้อมภายในเครื่องของคุณโดยใช้เครื่องมือเช่น รีซิงค์
, scp
, หรือ SFTP
.
หากคุณได้ติดตั้ง Drush (ผ่าน นักแต่งเพลงต้องการดรัช/ดรัช
) จึงจะสามารถใช้งานได้ drush sql:ซิงค์
เพื่อซิงโครไนซ์ฐานข้อมูล
ก่อนที่คุณจะทำเช่นนั้น คุณอาจต้องการตั้งค่า นามแฝง Drush สำหรับสภาพแวดล้อมในพื้นที่และระยะไกล
โปรดทราบด้วยว่า โยกย้าย Drush
ใช้เพื่อวัตถุประสงค์อื่น นั่นคือการโยกย้ายเนื้อหาของไซต์จากแพลตฟอร์มอื่นที่ไม่ใช่ Drupal ไปยังไซต์ Drupal ของคุณ
ในการทดลองทางความคิด สมมติว่าคุณมีไซต์ Drupal สามชุด ได้แก่ Dev, Stage และ Prod บนเซิร์ฟเวอร์เดียว (โดยใช้ Apache2 สามชุดที่แตกต่างกัน โฮสต์เสมือน
กับ DocumentRoot
ตั้งค่าให้ /var/www/dev
, /var/www/stg
, และ /var/www/prd
).
ในกรณีนั้น คุณสามารถใช้ local_sync
ฟังก์ชันที่กำหนดไว้ด้านล่างเพื่อซิงค์ฐานข้อมูลและไฟล์จากสภาพแวดล้อมที่สูงกว่าไปยังสภาพแวดล้อมที่ต่ำกว่า:
#!/bin/bash
â
ฟังก์ชัน local_drush () {
ถ้า [[ $# -eq 0 ]]; แล้ว
echo "local_drush (ตั้งค่าสภาพแวดล้อมและเรียกใช้โปรเจ็กต์-local drush)"
echo "การใช้งาน: local_drush [dev stg prd] [drush-args]"
echo "ตั้งค่าสภาพแวดล้อมเป็น dev stg หรือ prod จากนั้นส่ง argv ไปยัง local drush"
ไฟ
ถ้า [[ $1 == 'dev' ]] || [[ $1 == 'stg' ]] || [[ $1 == 'prd' ]]; แล้ว
RETURN_DIR=${PWD}
ซีดี /var/www/$1
./vendor/bin/drush ${@:2}
ซีดี ${RETURN_DIR}
อื่น
echo "การใช้งานไม่ถูกต้อง: arg แรกต้องเป็น dev, stg หรือ prd"
ไฟ
}
â
ฟังก์ชัน local_sync () {
ถ้า [[ $# -lt 1 ]] || [[ $# -gt 2 ]]; แล้ว
echo "local_sync (ย้ายฐานข้อมูลและไฟล์ไปยังสภาพแวดล้อมที่ต่ำกว่า)"
echo "การใช้งาน: local_sync <SOURCE> <TARGET>"
echo "ตั้งค่าสภาพแวดล้อมต้นทางและเป้าหมาย จากนั้นซิงค์ฐานข้อมูลและไฟล์"
ไฟ
ถ้า [[ $1 == 'prd' ]] || [[ $1 == 'stg' ]]; แล้ว
แหล่งที่มา=$1
ถ้า [[ $2 == 'stg' ]] || [[ $2 == 'พัฒนา' ]]; แล้ว
เป้าหมาย=$2
ถ้า [[ ( $1 = 'prd' && $2 == 'stg' ) || ( $1 = 'prd' && $2 == 'dev' ) || ( $1 = 'stg' && $2 == 'dev' ) ]]; แล้ว
RETURN_DIR=${PWD}
BACKUP_DIR=$HOME/sqldumps/${SOURCE}
BACKUP_FILE=${BACKUP_DIR}/${SOURCE}_$(วันที่ -I).sql
mkdir -p ${BACKUP_DIR}
SOURCE_FILES=/var/www/${SOURCE}/web/sites/default/files/
TARGET_FILES=/var/www/${TARGET}/web/sites/default/files/
EXCLUDE_CSS=${SOURCE_FILES}css/
EXCLUDE_JS=${SOURCE_FILES}js/
EXCLUDE_PHP=${SOURCE_FILES}php/
â
echo "กำลังสร้างการสำรองฐานข้อมูลชั่วคราวของสภาพแวดล้อม ${SOURCE} ..."
local_drush ${SOURCE} sql:dump > ${BACKUP_FILE}
â
ถ้า [[ -s "${BACKUP_FILE}" ]]; แล้ว
echo "กำลังนำเข้าฐานข้อมูลสำรองไปยังสภาพแวดล้อม ${TARGET} ..."
local_drush ${TARGET} sqlc < ${BACKUP_FILE}
echo "กำลังปรับใช้การกำหนดค่าแบบสเตจสำหรับ ${TARGET} สภาพแวดล้อม ..."
local_drush ${TARGET} ทำให้ใช้งานได้
echo "กำลังคัดลอกไฟล์สาธารณะจาก ${SOURCE} ไปยัง ${TARGET} ..."
rsync --ไม่รวม ${EXCLUDE_CSS} \
--ไม่รวม ${EXCLUDE_JS} \
--ไม่รวม ${EXCLUDE_PHP} \
--delete --progress -av ${SOURCE_FILES} ${TARGET_FILES}
echo "สร้างแคช Drupal ใหม่สำหรับสภาพแวดล้อม ${TARGET} ..."
local_drush แคช ${TARGET}:สร้างใหม่
echo "นำเข้าจาก ${SOURCE} ไปยัง ${TARGET} เรียบร้อยแล้ว"
echo "กำลังลบการสำรองฐานข้อมูลของสภาพแวดล้อม ${SOURCE} ..."
rm ${BACKUP_FILE}
ซีดี ${RETURN_DIR}
อื่น
echo "ข้อผิดพลาด: ไม่พบ ${BACKUP_FILE} ไม่สามารถดำเนินการต่อได้"
ไฟ
อื่น
echo "การใช้งานไม่ถูกต้อง: ไม่สามารถคัดลอกจาก ${SOURCE} ไปยัง ${TARGET}"
ไฟ
อื่น
echo "การใช้งานไม่ถูกต้อง: arg ที่สองต้องเป็น stg หรือ dev"
ไฟ
อื่น
ถ้า [[ $1 == 'dev' ]]; แล้ว
echo "การใช้งานไม่ถูกต้อง: ไม่สามารถย้ายจาก dev ไปยังสภาพแวดล้อมที่สูงกว่า"
อื่น
echo "การใช้งานไม่ถูกต้อง: arg แรกต้องเป็น prd หรือ stg"
ไฟ
ไฟ
}
โปรดทราบว่า local_sync
คำสั่งขึ้นอยู่กับ local_drush
คำสั่ง ซึ่งจะขึ้นอยู่กับโปรเจ็กต์โลคัลและรีโมตที่มี Drush in แบบไซต์-โลคัล ./vendor/bin/drush
, ซึ่งเป็น วิธีการที่แนะนำ ของการติดตั้ง Drush เชลล์สคริปต์ไม่ได้มาตรฐาน แต่มีข้อได้เปรียบในการทำงาน ไม่ว่าคุณจะกำหนดค่านามแฝงของ Drush อย่างถูกต้องหรือไม่ก็ตาม
ฉันจะปล่อยให้คุณเป็นแบบฝึกหัดเพื่อค้นหาวิธีรับไฟล์จากเซิร์ฟเวอร์ระยะไกลของคุณเข้าสู่สภาพแวดล้อมภายในเครื่องของคุณ ไม่มีอะไรผิดปกติในการทำตามขั้นตอนเหล่านี้ด้วยตนเองหรือใช้ Filezilla เพื่อถ่ายโอนไฟล์ผ่าน SFTP ผ่าน SSH แต่ให้พิจารณาว่า รีซิงค์
คำสั่ง (ในบรรทัดที่ 49-52) สามารถใช้กับตัวอื่นได้ ${แหล่งที่มา}
ซึ่งสามารถอยู่บนเซิร์ฟเวอร์ระยะไกลได้ การเปลี่ยนแปลงอื่น ๆ เพียงอย่างเดียวที่คุณต้องทำก็คือการเปลี่ยนแปลงเช่นกัน รีซิงค์
เดอะ ${BACKUP_FILE}
ไปยังท้องถิ่นของคุณ (ประมาณสาย 42)
ฮา! ฉันเห็นว่าคุณแก้ไขคำถามของคุณขณะที่ฉันเขียนคำตอบ
คำถามใหม่ของคุณซ้ำกัน ตอบแล้ว ที่นี่ โดย ไคลฟ์.
จากความคิดเห็นในคำตอบนั้น:
วิธีอย่างเป็นทางการคือสำหรับโมดูลที่ใช้วิธีเก่าในการเขียนโค้ดอย่างชัดเจนเพื่อให้การอัปเดตเกิดขึ้น hook_update_N
. รายละเอียดทั้งหมดอยู่ที่นี่: https://drupal.org/node/3034742
วิธีแก้ปัญหาคือการติดตั้ง การอัปเดตเอนทิตีของ Devel โมดูลซึ่งทำให้เก่า เอนอัพ drush
คำสั่งใช้ได้
คุณไม่ควรใช้สิ่งนี้ในการผลิต แต่คุณสามารถใช้ในสภาพแวดล้อมการพัฒนาในพื้นที่ของคุณ ตราบใดที่คุณไม่ส่งเสริมฐานข้อมูลในเครื่องของคุณไปยังสภาพแวดล้อมการผลิต
ดูเหมือนว่าคุณประสบปัญหานี้เฉพาะในเครื่องของคุณ ไม่ใช่ในเวอร์ชันที่ใช้งานจริง ดังนั้นตัวเลือกนี้อาจเหมาะกับคุณ
ขอให้โชคดี!