Найти - Пользователи
Полная версия: Обновление программы по сети
Начало » Python для экспертов » Обновление программы по сети
1 2 3
Андрей Светлов
“skip-archive”, “do not place Python bytecode files in an archive, put them directly in the file system”

только оновыми модулями не отделаться, к сожалению. Мне рано или поздно приходилось выкладывать исправления к ним.
j2a
Андрей Светлов
Системы контроля версий избыточны.
По мне, не так однозначно и, конечно, зависит от ситуации.

Андрей Светлов
Объем на диске как минимум в два раза больше, чем без них.
IMHO, это вообще не проблема. Те же eggs:
1) Каждая версия лежит отдельно и занимает соответственно. Для возможности отката всё равно придется держать минимум две версии.
2) При обновлении тянется всё приложение целиком, а не только изменения (как в VCS).
astoon
Если честно, не знаю что такое скип-архив …

Но оказалось, решение с library.zip в py2exe лежит на поверхности:
екзешник можно обмануть, подсунув ему вместо архива каталог с названием ‘library.zip’ :)

Возник вопрос:
корректно ли писать операторы import в блоке if ?
Андрей Светлов
Корректно.
setup.py py2exe –skip-archive

j2a Конечно, все не так просто. И смотреть нужно заново в каждом конкретном случае
bialix
Андрей Светлов
Системы контроля версий избыточны. Объем на диске как минимум в два раза больше, чем без них.
Ваше замечание справедливо наверное только для svn. В других системах оболегченные чекауты гораздо легковеснее.
Андрей Светлов
Обычно .bzr занимает примерно половину проекта. Это вполне объяснимо: должен же как-то проходить bzr diff, например, даже при отсутствии подключения к интернету.
С subversion та же история.

облегченные для bazaar - это как?
bzr checkout –lightweight … ?

Да, меньше. Только не прийдется ли чрезмерно много по инету спрашивать, что же все-таки изменилось? Или там через sha1 все быстро смотрят, спускаясь вниз по каталогам?

И еще. bazaar под GPL? Т.е. в коммерческом проекте я его не смогу использовать как часть системы апдейта?
j2a
Андрей Светлов
И еще. bazaar под GPL?
Угу. hg тоже.

Андрей Светлов
Т.е. в коммерческом проекте я его не смогу использовать как часть системы апдейта?
В коммерческом можете. В проприетарном - нет.

Естественно, вопрос лицензии возникает при редистрибуции софта. Если для коммерческих нужд собственного предприятия - без проблем.
bialix
Андрей Светлов
Обычно .bzr занимает примерно половину проекта. Это вполне объяснимо: должен же как-то проходить bzr diff, например, даже при отсутствии подключения к интернету.
С subversion та же история.
Чем больше история проекта тем толще становится .bzr. Это не совсем эквивалентно случаю svn. Там в служебном каталоге хранятся эталонные копии всех файлов.

облегченные для bazaar - это как?
bzr checkout –lightweight … ?
Да, это практически полный аналог чекаута в CVS.

Да, меньше. Только не прийдется ли чрезмерно много по инету спрашивать, что же все-таки изменилось? Или там через sha1 все быстро смотрят, спускаясь вниз по каталогам?
Если просто спросить изменилась текущая ревизия или нет – то достаточно быстро. При реальном обновлении трафик будет больше, чем в случае с svn. Над этим работают. В частности, уже имеется возможность применять smart-server а-ля svn. При этом трафик будет гораздо меньше. Точные цифры не скажу.

И еще. bazaar под GPL? Т.е. в коммерческом проекте я его не смогу использовать как часть системы апдейта?
Если использовать его через command-line interface, то я не вижу причин почему нет. В сырцы вы не лезете, интеграция идет на уровне операционной системы. Распространять его вместе со своим приложением GPL не возобраняет, главное чтобы все лицензии рядом лежали с указанием авторства (Canonical Ltd).
Nbush
astoon
Основная идея - добавлять новые модули. Они же и должны изменяться/обновляться.
Можно просто выполнять файл через Exec, проверяя, скажем, папку Plugin. Небезопасно конечно.
balu
bialix
можно сделать простой батник, который будет делать автоматизацию этого процесса перед запуском собственно вашей программы.
Я подобную задачу для себя давно решил сравнивая даты ехе-шника и архива.

cd .\locale\ru\LC_MESSAGES
..\..\..\launcher \\srv\exchange\miha\kaa\locale\ru\LC_MESSAGES\kwindow.mo
launcher \\srv\exchange\miha\kaa\library.zip
7za.exe d library.zip config.pyc
7za.exe u library.zip config.py
launcher r \\srv\exchange\miha\kaa\kwinit.exe
exit
Таким образом обновляется только 1 файл из library.zip, который собирается 1 раз.

Программа, которая сравнивает дату и размер на делфи:

program launcher;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes;

function FileLength(const FileName: string): Int64;
var
FileHandle: Integer;
begin
Result := -1;
FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
if FileHandle = -1 then
Exit;
try
Result := FileSeek(FileHandle, Int64(0), 2);
finally
FileClose(FileHandle);
end;
end;

//******************************************************************************
procedure help;
begin
writeln ('*************************************************************************');
writeln ('* Usage Launcher.exe *');
writeln ('* Launcher.exe *');
writeln ('* : *');
writeln ('* r or R - copy and run PATH file *');
writeln ('* <NONE> - copy but not run PATH file *');
writeln ('* *');
writeln ('* : *');
writeln ('* If you call this program with option “r” then all symbols before [FULL*');
writeln ('* PATH TO FILENAME] perceiving as execute filename''s options *');
writeln ('* *');
writeln ('*************************************************************************');
writeln ('Press ENTER to EXIT');
readln;
end;
//******************************************************************************
procedure load(path, option, cmd_option:string);
var f:string;
begin
if not FileExists(path) then
writeln ('cannot find file ‘+path);
f:=’./'+ExtractFileName(path);
if (not FileExists(f)) or
(FileAge(f) <> FileAge(path)) or (FileLength(f) <> FileLength(path)) then
if not copyfile(PChar(path), PChar('./'+ExtractFileName(path)), false) then
writeln ('cannot load file ‘+path) else writeln (’File ‘+path +’ was loaded');
if (option='r') and ((ExtractFileExt(path)='.exe')
or (ExtractFileExt(path)='.com') or(ExtractFileExt(path)='.bat'))
then begin
if not WinExec(PChar(f+cmd_option), SW_RESTORE)=0 then
writeln ('cannot execute file ‘+f+cmd_option)
else writeln (’File ‘+f +cmd_option+’ was executed');
end;
end;


//******************************************************************************
var
I: Integer;
Cmd, option, Cmd_Options: string;
begin
if ParamCount = 0 then
help;
case ParamCount of
1:begin
if length(ParamStr(1))>1 then
begin
Cmd := lowercase(ParamStr(1));
load(ExpandUNCFileName(Cmd), ‘0’, ‘');
end else
help;
end;
2:begin
Cmd := lowercase(ParamStr(2));
option:= lowercase(ParamStr(1));
load(ExpandUNCFileName(Cmd), Option, ’');
end;
else begin
if lowercase(ParamStr(1)) <> ‘r’ then help
else begin
Cmd := lowercase(ParamStr(2));
option:= lowercase(ParamStr(1));
Cmd_Options:='';
for I:=3 to ParamCount do
Cmd_Options:=Cmd_Options+' '+ParamStr(I);
load(ExpandUNCFileName(Cmd), Option, Cmd_Options);
end;
end;
end;//case

end.


и на PhreePascal

program launcher;
{$APPTYPE CONSOLE}
uses
Dos, Windows, SysUtils;

//******************************************************************************
function FileLength(const FileName: string): Int64;
var
FileHandle: Integer;
begin
Result := -1;
FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyWrite);
if FileHandle = -1 then
Exit;
try
Result := FileSeek(FileHandle, Int64(0), 2);
finally
FileClose(FileHandle);
end;
end;

//******************************************************************************
procedure help;
begin
writeln ('*************************************************************************');
writeln ('* Usage Launcher.exe *');
writeln ('* Launcher.exe *');
writeln ('* : *');
writeln ('* r or R - copy and run PATH file *');
writeln ('* <NONE> - copy but nozt run PATH file *');
writeln ('* *');
writeln ('* : *');
writeln ('* If you call this program with option “r” then all symbols before [FULL*');
writeln ('* PATH TO FILENAME] perceiving as execute filename''s options *');
writeln ('* *');
writeln ('*************************************************************************');
writeln ('Press ENTER to EXIT');
readln;
end;
//******************************************************************************
procedure load(path, option, cmd_option:string);
var f:string;
begin
if not FileExists(path) then
writeln ('cannot find file ‘+path);
f:=’./'+ExtractFileName(path);
if (not FileExists(f)) or
(FileAge(f) <> FileAge(path)) or (FileLength(f) <> FileLength(path)) then
begin
if not copyfile(PChar(ExpandFileName(path)), PChar('./'+ExtractFileName(path)), true) then
writeln ('cannot load file ‘+path)
else writeln (’File ‘+path +’ was loaded');
end;
if (option='r') and ((ExtractFileExt(path)='.exe')or (ExtractFileExt(path)='.com')
or(ExtractFileExt(path)='.bat'))
then begin
Exec(f, cmd_option);
if DosExitCode=0 then
writeln ('cannot execute file ‘+f+cmd_option)
else writeln (’File ‘+f +cmd_option+’ was executed');
end;
end;


//******************************************************************************
var
I: Integer;
Cmd, option, Cmd_Options: string;
begin
if ParamCount = 0 then
begin
help;
Exit;
end;
case ParamCount of
1:begin
if length(ParamStr(1))>1 then
begin
Cmd := lowercase(ParamStr(1));
load(ExpandUNCFileName(Cmd), ‘0’, ‘');
end else
help;
end;
2:begin
Cmd := lowercase(ParamStr(2));
option:= lowercase(ParamStr(1));
load(ExpandUNCFileName(Cmd), Option, ’');
end;
else begin
if lowercase(ParamStr(1)) <> ‘r’ then help
else begin
Cmd := lowercase(ParamStr(2));
option:= lowercase(ParamStr(1));
Cmd_Options:='';
for I:=3 to ParamCount do
Cmd_Options:=Cmd_Options+' '+ParamStr(I);
load(ExpandUNCFileName(Cmd), Option, Cmd_Options);
end;
end;
end;//case

end.



Могу дать готовый ехе-шник. А вообще я пришел к выводу, что то, что импортируется выгодней держать в базе данных, обновляя при необходимости.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB