หน้าเว็บ

วันอาทิตย์ที่ 27 กรกฎาคม พ.ศ. 2551

ปัญหา buildout ของ Plone บน Windows ที่มี Visual Studio >= 2005

สำหรับการลง plone โดยใช้วิธี buildout นั้นอาจจะมีปัญหากับเครื่องที่เป็น Windows ที่มี Visual Studio ตั้งแต่เวอร์ชั่น 2005 ขึ้นไป โดย error message จะฟ้องตอนขณะคอมไพล์ Zope ว่า
error: Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

ซึ่งวิธีแก้อย่างแรกคือบน Windows ต้องลง Mingw ก่อน ซึ่งเป็น package ที่รวม gcc compiler สำหรับ Windows เอาไว้
ซึ่งก็จะช่วยแก้ปัญหาได้
แต่สำหรับบางเครื่องที่ผมไปลง เหมือนกับว่ามันไม่ยอมไปเรียก Mingw ทั้งๆที่ได้ set path เอาไว้แล้ว (รวมทั้งสร้างไฟล์ distutil.cfg ให้เรียก compiler=mingw32 แล้วด้วย) ซึ่งไม่แน่ใจว่าเป็นที่เครื่องหรือเป็นที่ผมตั้งค่าไม่เป็น แล้วมันก็เลยยังฟ้อง error อยู่แบบนั้น
วิธีแก้คือไปแก้ไข code ที่มันจะทำการ compile zope โดยไฟล์นั้นจะอยู่ที่ %YOUR_PLONE_DIR%\eggs\plone.recipe.zope2install-2.2-py2.4.egg\plone\recipe\zope2install\ ชื่อไฟล์ว่า __init__.py

ให้แก้ตรงที่ทำการเรียกคำสั่ง setup.py คือ
assert os.spawnl(
os.P_WAIT, options['executable'], options['executable'],
'setup.py',
'build_ext', '-i',
) == 0

เป็น
assert os.spawnl(
os.P_WAIT, options['executable'], options['executable'],
'setup.py',
'build_ext -c mingw32', '-i',
) == 0

คือเป็นการระบุไปเลยว่าให้ใช้ compiler คือ mingw32
โดยในไฟล์จะมีอยู่ 2 ที่ที่เรียก setup.py ก็ให้แก้ทั้ง 2 ที่เลย
แล้วก็ค่อยสั่ง buildout ใหม่อีกรอบ ก็จะสามารถคอมไพล์ได้

ระบบที่ทดสอบ
OS: Windows Server 2003 with Visual Studio 2008 and Mingw32
Plone: 3.06 (install by using buildout)

No traversable adapter found บน Plone Site

เมื่อวานได้เอาโปรแกรมที่พัฒนาด้วย plone version ใหม่ไปติดตั้งบนเครื่อง server ที่เคยลง version เก่าไว้แล้ว
ซึ่งเวลาลงก็คือทำการปิด service แล้วเอา code .py ตัวใหม่ที่พัฒนาไปวางทับตัวเก่าที่ชื่อเดียวกัน
ซึ่งตอนที่ทำกับเครื่องที่บ้านก็ไม่มีปัญหาอะไร พอวางเสร็จก็เปิด service แล้วก็ไป reinstall product ก็ใช้ได้งานได้ปกติ
แต่ว่าที่เอาที่เครื่อง server เกิดปัญหาคือพอลง code ทับแล้วเปิด service แล้วพอจะเข้าไปหน้าเวบนั้นมันกลับฟ้องว่า
('No traversable adapter found', {'extension_profiles': ({'product':
'kupu', 'description': 'Extension profile for Kupu', 'for': , 'title':
'Kupu', 'version': 'kupu 1.4.3', 'path': 'plone/profiles/default',
'type': 2, 'id': 'kupu:default'},), 'args': (), 'base_profiles': (),
'default_profile': 'Products.CMFPlone:plone'})
.....
.....

ตามด้วยข้อมูลอื่นๆอีกยาวเหยียดทั้งหน้าเวบ
แต่ว่าพอลองเปิด service แบบ debug mode (หรือ foreground mode) ด้วยใช้คำสั่ง .\bin\primary fg ปรากฎว่าเครื่องสามารถทำงานได้ถูกต้อง หน้าเวบขึ้น แล้วก็ไม่มี error message อะไรเลย
พยายามนั่งแก้อยู่หลายชั่วโมงก็ยังไม่เจอวิธีที่สามารถแก้ไข error สุดงงนี้ได้ สุดท้ายเลยลอง restart เครื่อง server เลย
แปลกแต่จริง error นั้นหายไปเลย และสามารถใช้งานได้ตามปกติแม้จะไม่ใช่ debug mode
จนถึงตอนนี้ก็ยังไม่รู้สาเหตุที่แท้จริง

(แต่สำหรับบางคนปัญหานี้อาจเกิดจากว่าเผลอไปแก้ชื่อไฟล์ ทำให้โปรแกรมหาไม่เจอ เช่น มีการเติม s หลังชื่อไฟล์โดยไม่ได้ตั้งใจเป็นต้น)

ระบบที่ทดสอบ
OS: Windows Server 2003
Plone: 3.0.6 (runs as an instance on ZEOServer)
Zope: 2.10