我有一个在 .NET 中调用的 matlab 程序来进行一些计算并生成输出。
我想要某种自动版本检测。
例如,当程序运行时,我希望将编译(构建)日期写入输出旁边的数据库。(我不在乎运行未编译代码时会发生什么)
我知道如何通过每次构建时更改源代码来手动执行此操作,但我正在寻找一种自动执行此操作的方法。
我有一个在 .NET 中调用的 matlab 程序来进行一些计算并生成输出。
我想要某种自动版本检测。
例如,当程序运行时,我希望将编译(构建)日期写入输出旁边的数据库。(我不在乎运行未编译代码时会发生什么)
我知道如何通过每次构建时更改源代码来手动执行此操作,但我正在寻找一种自动执行此操作的方法。
我想你知道 MatLab 是解释型语言,所以没有编译日期。
作为一种解决方法,您可以这样做。在您的程序中添加以下行:
try
CompilationDateTime = GetCompilationDateTime
catch
% GetCompilationDateTime not found
CompilationDateTime = 0 % the default compilation date/time
end
然后使用这个功能
function UpdateCompilationDateInCurrentDir
fh = fopen('GetCompilationDateTime.m','w');
fprintf(fh, 'function res = GetCompilationDateTime\n');
fprintf(fh, 'res = %s\n',num2str(now));
fprintf(fh, 'end\n');
fclose(fh);
end
因此,您必须UpdateCompilationDateInCurrentDir
在编译应用程序(手动或从构建脚本)之前立即调用,并且当前日期/图块将被打印到GetCompilationDateTime
函数中以供以后使用。
受@anandr 的启发,我最终想出了一个小功能。它完全按照他的建议做了一些额外的事情。概括这一点应该不难。
function usedeploytooltobuildfoo
% Update the m file that contains the date and build foo
%% Specifics of this project
my_function_name = 'foo';
location_of_project = 'C:\fooproject.prj';
%% General
% Find the location of the function, this is where we will write the new timestamp function
location_of_mainfunction = which(my_function_name);
location_of_mainfunction = location_of_mainfunction(1:end-2-length(my_function_name)); %Truncate the end of the path
% Design the function that can be used to read out the timestamp
my_new_functionstring = ['function t = myTimeStamp; t=' datestr(now,'YYYYmmDDHHMM') ';'];
% Write the new timestamp function
fid = fopen([location_of_mainfunction 'myTimeStamp.m'],'w');
fprintf(fid,'%s',my_new_functionstring);
fclose(fid);
% Now execute the build
deploytool('-build',location_of_project)
现在在代码中我可以调用myTimeStamp
并将其写为输出。
你在使用源代码控制吗?如果是这样,那么您应该能够让它在结帐期间自动将修订号(和/或当前日期和时间)插入您的源代码中。
如果您将其插入某个位置(例如在sprintf
语句的输出中),那么您的代码应该能够报告其修订号。
最后,仅从刚刚签出的代码构建。