Tcl Starkit, считывающий базу данных Sqlite - PullRequest
3 голосов
/ 17 сентября 2009

Я пытаюсь создать приложение Tcl, которое считывает базу данных Sqlite. Когда я собираю starkit для приложения и помещаю файл базы данных Sqlite рядом с файлом .tcl в папку .vfs и пытаюсь запустить приложение (.exe), я получаю сообщение об ошибке "не удается найти пакет sqlite3 во время выполнения пакет требует sqlite3 ".

Я считаю, что мое приложение не может найти файл базы данных. Перед сборкой starkit приложение .tcl может прочитать базу данных Sqlite, но после создания starkit файл .tcl получает ошибку.

Кто-нибудь знает, как разрешить приложению Tcl starkit читать файл базы данных Sqlite?

Спасибо

DFM

Ответы [ 3 ]

5 голосов
/ 17 сентября 2009

Я думаю, что более вероятно, что ваш starkit не может загрузить пакет sqlite3. Вы создали каталог lib в своей папке .vfs и скопировали в него пакет sqlite3?

4 голосов
/ 17 сентября 2009

Звучит так, будто вы обсуждаете две разные вещи в своем вопросе.

Первое - это возможность загрузки библиотеки sqllite3. Как отметил Джексон, вам нужно включить библиотеку sqllite3 (tcl и сопутствующие файлы) в каталог lib вашего starpack. После того, как это будет сделано правильно, команда «package required sqlite3» должна работать правильно.

Второй относится к -писываемому флагу . Если я правильно понимаю, это просто позволяет вам изменять файлы в старпаке во время его работы. Это не имеет ничего общего с возможностью загрузки библиотеки, включенной в starpack, но будет использоваться, чтобы позволить этой библиотеке изменять файлы (например, файл базы данных, о котором вы говорили).

У меня сложилось впечатление, что невозможно записать в (файл внутри) запущенный starkit из-за определенных ограничений ОС. Тем не менее, я нашел следующее из удивительной книги Брента Уэлча "Практическое программирование в Tcl и Tk":

Если вы запустите файл write.kit несколько раз, вы заметите, что файл write.kit / data.new не сохраняется между запусками. Это связано с тем, что по умолчанию база данных Metakit изменяется в основной памяти и не записывается в файл Starkit. если вы хотите хранить файл в течение длительного времени, используйте -записываемый флаг для sdx:

sdx wrap write.kit writable

Ссылка: Google Книги

2 голосов
/ 18 сентября 2009

С помощью каждого, кто ответил на мой вопрос, и с помощью тщательного исследования я выяснил шаги для создания звездного пакета, который обернет приложение Tcl с серверной частью Sqlite. Шаги для создания starpack следующие:

  1. Загрузите и поместите в папку tclkit-win32.upx.exe и sdx.kit.

  2. Сделайте копию tclkit-win32.upx.exe и переименуйте ее в tclkit.exe (оставить в той же папке)

  3. Добавьте ваше приложение .tcl (test.tcl) в папку (убедитесь, что оно имеет код package require sqlite.

  4. Запустите файл tclkit-win32.upx.exe и введите в каждой строке следующее (не закрывайте, когда закончите):

    source sdx.kit
    package require sdx
    sdx::sdx qwrap test.tcl
    sdx::sdx unwrap test.kit
    
  5. Загрузите tclsqlite3.dll с веб-сайта sqlite и поместите в отдельную папку. Назовите папку sqlite.

  6. Используйте текстовое приложение, например Блокнот, и добавьте следующий код:

    package ifneeded sqlite 3.6.18 [list load [file join $dir tclsqlite3.dll]].
    

    Сохранить как pkgIndex.tcl и поместить в папку sqlite с помощью tclsqlite3.dll.

  7. Перейдите в первую папку на первом этапе. Вы должны увидеть папку .vfs. Откройте папку .vfs, а затем откройте папку lib. Поместите папку sqlite в папку lib. Папка lib должна иметь папку app-test (соответствует test.tcl) и папку sqlite.

    Альтернатива шагам 5-7: скопируйте папку, содержащую dll sqlite, из папки tcl на C: \ в папку lib. Вы можете проверить путь к DLL, используя

      package ifneeded sqlite3 [package require sqlite3]
    

    В папке sqlite будет два файла: файл dll и pkgIndex.tcl. Если вы делаете это таким образом, вы должны использовать package require sqlite3 на шаге 3.

  8. Если tclkit-win32.upx.exe все еще работает, введите следующий код:

    sdx::sdx wrap test.exe -runtime tclkit.exe
    
  9. Наконец, поместите файл sqlite .db рядом с вновь созданным приложением .exe (test.exe) и запустите приложение.

Обязательно следите за конфликтами версий. У меня были серьезные проблемы с фрагментом кода package require sqlite. Первоначально у меня был package require sqlite3, который не работал. Кроме того, при создании файла pkgIndex.tcl убедитесь, что установлена ​​правильная версия sqlite (т. Е. 3.2.18 и т. Д.).

Спасибо всем за помощь.

DFM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...