以编程方式创建和编辑工程
此示例说明如何使用命令行来自动执行工程任务以操作文件。该示例包括如何创建引用工程现有工程文件、设置工程路径以及定义工程快捷方式。它还说明如何处理修改后的文件、依存关系和标签。
创建工程对象
Times Table App 示例工程在 Git™ 源代码管理下。要创建工程对象,请使用 currentProject
或 openProject
。
mainProject = openProject("TimesTableApp");
检查工程文件
检查工程中的文件。
files = mainProject.Files
files=1×13 object
1x13 ProjectFile array with properties:
Path
Revision
SourceControlStatus
Labels
使用索引访问此列表中的文件。例如,获取编号为 10 的文件。每个文件都有说明其路径和附加的标签的属性。
mainProject.Files(10)
ans = ProjectFile with properties: Path: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities" Revision: "b3ff013c1170d896663ae4ab6c07cff006850aa1" SourceControlStatus: NotUnderSourceControl Labels: [1x0 matlab.project.Label]
获取第十个文件的 Git 最新修订版。
mainProject.Files(10).Revision
ans = "b3ff013c1170d896663ae4ab6c07cff006850aa1"
检查第十个文件的标签。
mainProject.Files(10).Labels
ans = 1x0 Label array with properties: File DataType Data Name CategoryName
按名称获取特定文件。
myfile = findFile(mainProject,"source/timestable.mlapp")
myfile = ProjectFile with properties: Path: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/source/timestable.mlapp" Revision: "b3ff013c1170d896663ae4ab6c07cff006850aa1" SourceControlStatus: Unmodified Labels: [1x1 matlab.project.Label]
创建新工程
创建 Times Table Game 工程。此工程用于存储 Times Table App 背后的游戏逻辑。Times Table Game 工程将通过工程引用由 Times Table App 工程使用。
创建工程并设置工程名称。
timesTableGameFolder = fullfile(mainProject.RootFolder,"refs","TimesTableGame"); timesTableGame = matlab.project.createProject(timesTableGameFolder); timesTableGame.Name = "Times Table Game";
将 Times Table App 游戏逻辑从主工程文件夹移至新工程文件夹,并将其添加到 Times Table Game 工程中。然后,从 Times Table App 工程中删除该文件。
movefile("../../source/timesTableGame.m"); addFile(timesTableGame,"timesTableGame.m"); reload(mainProject); removeFile(mainProject,"source/timesTableGame.m");
将 Times Table Game 工程根文件夹添加到 Times Table Game 工程路径。这样,在加载 Times Table App 工程或任何引用 Times Table App 工程的工程时,timesTableGame.m
文件处于可用状态。
reload(timesTableGame); addPath(timesTableGame,timesTableGame.RootFolder);
添加工程引用
将新 Times Table Game 工程作为工程引用添加到 Times Table App 工程中。这允许 Time Table App 工程查看、编辑和运行 Times Table Game 工程中的文件。
reload(mainProject); addReference(mainProject,timesTableGame);
获取修改的文件
获取 Times Table App 工程中的所有修改的文件。将此列表与工程中的文件 > 已修改视图进行比较。您可以看到新 Times Table Game 工程的文件,以及 Times Table App 工程中已删除和修改的文件。
modifiedfiles = listModifiedFiles(mainProject)
modifiedfiles=1×37 object
1x37 ProjectFile array with properties:
Path
Revision
SourceControlStatus
Labels
获取列表中的第二个修改的文件。注意 SourceControlStatus
属性为 Added
。listModifiedFiles
函数返回所添加、修改、删除以及发生冲突的任何文件。
modifiedfiles(2)
ans = ProjectFile with properties: Path: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/refs/TimesTableGame/resources/project/EEtUlUb-dLAdf0KpMVivaUlztwA/Z_K-znBXsw6jSE5Zw2JxQ1aJnJsd.xml" Revision: "" SourceControlStatus: Added
在查询单个文件之前刷新源代码管理状态。在调用 listModifiedFiles
之前,您不需要这样做。
refreshSourceControl(mainProject)
获取状态为 Unmodified
的所有工程文件。使用 ismember
函数获得一个逻辑值数组,其中列出 Times Table App 工程中未修改的文件。使用该数组获取未修改文件的列表。
unmodifiedStatus = ismember([mainProject.Files.SourceControlStatus],matlab.sourcecontrol.Status.Unmodified); mainProject.Files(unmodifiedStatus)
ans=1×8 object
1x8 ProjectFile array with properties:
Path
Revision
SourceControlStatus
Labels
获取文件依存关系
运行依存关系分析以更新工程文件之间的已知依存关系。
updateDependencies(mainProject)
获取 Times Table App 工程中的依存关系列表。Dependencies
属性包含工程文件之间的依存关系图,存储为 MATLAB digraph
对象。
g = mainProject.Dependencies
g = digraph with properties: Edges: [6x1 table] Nodes: [9x1 table]
获取 timestable.mlapp
文件所需的文件。
requiredFiles = bfsearch(g, which('source/timestable.mlapp'))
requiredFiles = 2x1 cell
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/source/timestable.mlapp' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/refs/TimesTableGame/timesTableGame.m'}
获取图中所有类型的顶层文件。indegree
函数查找不被任何其他文件依赖的所有文件。
top = g.Nodes.Name(indegree(g)==0)
top = 7x1 cell
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tAnswerIsCorrect.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tCurrentQuestion.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tNewTimesTable.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/runTheseTests.m' }
获取具有依存关系的顶层文件。indegree
函数查找不被任何其他文件依赖的所有文件,outdegree
函数查找具有依存关系的所有文件。
top = g.Nodes.Name(indegree(g)==0 & outdegree(g)>0)
top = 5x1 cell
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tAnswerIsCorrect.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tCurrentQuestion.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/tests/tNewTimesTable.m' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m' }
通过创建转置图查找影响的(即“上游”)文件。使用 flipedge
函数反转图中边的方向。
transposed = flipedge(g)
transposed = digraph with properties: Edges: [6x1 table] Nodes: [9x1 table]
impacted = bfsearch(transposed,which('source/timestable.mlapp'))
impacted = 3x1 cell
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/source/timestable.mlapp' }
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
{'/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m' }
获取工程文件的信息,例如依存关系和孤立项的数量。
averageNumDependencies = mean(outdegree(g)); numberOfOrphans = sum(indegree(g)+outdegree(g)==0);
更改依存关系图的排序顺序,以自下而上显示工程更改。
ordered = g.Nodes.Name(flip(toposort(g)));
查询快捷方式
您可以使用快捷方式保存常见任务和经常访问的文件,或者自动执行启动和关闭任务。
获取 Times Table App 工程快捷方式。
shortcuts = mainProject.Shortcuts
shortcuts=1×4 object
1x4 Shortcut array with properties:
Name
Group
File
检查列表中的快捷方式。
shortcuts(2)
ans = Shortcut with properties: Name: "Edit Times Table App" Group: "Launch Points" File: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m"
获取快捷方式的文件路径。
shortcuts(3).File
ans = "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m"
检查快捷方式列表中的所有文件。
{shortcuts.File}'
ans=4×1 cell array
{["/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/source/timestable.mlapp" ]}
{["/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m" ]}
{["/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m"]}
{["/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/runTheseTests.m" ]}
为文件加标签
创建 char
类型的新标签类别。在 Times Table App 工程中,新的 Engineers
类别将出现在标签窗格中。
createCategory(mainProject,'Engineers','char')
ans = Category with properties: SingleValued: 0 DataType: "char" Name: "Engineers" LabelDefinitions: [1x0 matlab.project.LabelDefinition]
在新类别中定义一个新标签。
category = findCategory(mainProject,'Engineers'); createLabel(category,'Bob');
获取新标签的标签定义对象。
ld = findLabel(category,'Bob')
ld = LabelDefinition with properties: Name: "Bob" CategoryName: "Engineers"
将标签附加到工程文件。如果您在 Times Table App 工程中选中该文件,您可以在标签编辑器窗格中看到该标签。
myfile = findFile(mainProject,"source/timestable.mlapp"); addLabel(myfile,'Engineers','Bob');
获取某特定标签,并在该标签上附加文本数据。
label = findLabel(myfile,'Engineers','Bob'); label.Data = 'Email: Bob.Smith@company.com'
label = Label with properties: File: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/source/timestable.mlapp" DataType: "char" Data: 'Email: Bob.Smith@company.com' Name: "Bob" CategoryName: "Engineers"
检索标签数据并将其存储在变量中。
mydata = label.Data
mydata = 'Email: Bob.Smith@company.com'
创建数据类型为 double 的新标签类别,MATLAB 通常将该数据类型用于数值数据。
createCategory(mainProject,'Assessors','double'); category = findCategory(mainProject,'Assessors'); createLabel(category,'Sam');
将新标签附加到指定的文件,并为该标签分配数据值 2。
myfile = mainProject.Files(10); addLabel(myfile, 'Assessors', 'Sam', 2)
ans = Label with properties: File: "/tmp/Bdoc24a_2511836_3459710/tp283b0455/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m" DataType: "double" Data: 2 Name: "Sam" CategoryName: "Assessors"
关闭工程
关闭工程以运行关闭脚本并检查未保存的文件。
close(mainProject)