在MATLAB

时间:2016-10-16 06:39:40

标签: matlab

我正在编写一个我希望能够自动更新自己的功能。换句话说,当函数运行时,我希望它检查编辑器中的当前代码是否是最新版本,如果不是,请获取最新版本。

我已经解决了关于获取最新版本的部分;但是,我还没有找到一种方法从当前代码中调用这个新更新的代码。因此,即使代码更新后,我仍然希望新代码使用与原始调用相同的输入运行。以下是我的意思的简短示例:

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更新),它会调用过时的代码。

我假设发生这种情况是因为整个程序已加载到缓存中。有没有办法清除当前运行的功能并加载新版本?当我退出该函数时,然后按预期使用新代码更新该文件,我只是在寻找在执行同一文件期间强制执行该更新的方法。

到目前为止,我已经尝试了rehashclear,但两者都没有运气。使用这些函数中的任何一个仍然会导致调用旧版本的代码。我尝试在下载后调用rehashclear,并在调用restartCode函数中的函数之前调用。

如果无法做到这一点,还有其他解决方法吗? 我考虑过自动下载另一个可以重启函数的文件并在onCleanup函数中调用这个新函数,但后来我需要删除那个新文件(我绝对可以在{{1函数 - 我只是在寻找更清晰的替代方案。)从onCleanup调用外部函数仍然不使用更新的代码。

不幸的是,git(或任何源代码控制)不是一个选项。

1 个答案:

答案 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