我正在编写一个我希望能够自动更新自己的功能。换句话说,当函数运行时,我希望它检查编辑器中的当前代码是否是最新版本,如果不是,请获取最新版本。
我已经解决了关于获取最新版本的部分;但是,我还没有找到一种方法从当前代码中调用这个新更新的代码。因此,即使代码更新后,我仍然希望新代码使用与原始调用相同的输入运行。以下是我的意思的简短示例:
function autoUpdatingCode(varargin)
if not_most_recent_version
urlwrite('http://somewebsite.com/autoUpdatingCode.p','autoUpdatingCode_updated.p')
delete('autoUpdatingCode.p');
movefile('autoUpdatingCode_updated.p','autoUpdatingCode.p');
c = onCleanup(@() restartCode(varargin));
return
end
... code for the function ...
end
function restartCode(inputs)
if isempty(inputs)
autoUpdatingCode();
elseif length(inputs)==1
autoUpdatingCode(inputs{1});
... so on for more inputs ...
end
end
在这里,我下载新代码,删除旧版本,并将更新后的版本重命名为正确的文件名。
请注意,restartCode
函数与autoUpdatingCode
保存在同一文件中。这里的问题是autoUpdatingCode
函数内的restartCode
调用不会调用新更新的文件(如图所示使用movefile
更新),它会调用过时的代码。
我假设发生这种情况是因为整个程序已加载到缓存中。有没有办法清除当前运行的功能并加载新版本?当我退出该函数时,然后按预期使用新代码更新该文件,我只是在寻找在执行同一文件期间强制执行该更新的方法。
到目前为止,我已经尝试了rehash
和clear
,但两者都没有运气。使用这些函数中的任何一个仍然会导致调用旧版本的代码。我尝试在下载后调用rehash
和clear
,并在调用restartCode
函数中的函数之前调用。
如果无法做到这一点,还有其他解决方法吗? 我考虑过自动下载另一个可以重启函数的文件并在从onCleanup调用外部函数仍然不使用更新的代码。onCleanup
函数中调用这个新函数,但后来我需要删除那个新文件(我绝对可以在{{1函数 - 我只是在寻找更清晰的替代方案。)
不幸的是,git(或任何源代码控制)不是一个选项。
答案 0 :(得分:0)
在搞乱了一段时间后,我找到了解决方案。正如@suever的评论所暗示的那样,不可能删除该文件,然后期望调用更新版本。 (更多细节here)。
但是,我能够利用function precedence来解决这个问题。我没有将新文件复制到同一目录,而是创建了一个临时目录,将其复制到那里,然后从该目录中调用该函数。由于函数优先级,调用更新版本而不是加载到内存中的程序。最后一步是使用dbstack
(docs here)来确定程序是否被递归调用,在这种情况下,我将更新后的文件从临时目录移动到正确的位置并执行必要的清理。以下是更新代码的一部分:
function autoUpdatingCode(varargin)
stack = dbstack('-completenames');
... process the stack ...
if recursively_called
cd('..');
movefile(newfile, oldfile);
rmdir('temp','s');
end
if not_most_recent_version
mkdir('temp');
websasve('./temp/autoUpdatingCode_updated.p', 'http://somewebsite.com/autoUpdatingCode.p',)
cd('temp');
c = onCleanup(@() restartCode(varargin));
return
end
... code for the function ...
end
function restartCode(inputs)
if isempty(inputs)
autoUpdatingCode();
elseif length(inputs)==1
autoUpdatingCode(inputs{1});
... so on for more inputs ...
end
end