主要内容

以编程方式创建和编辑工程

此示例说明如何使用命令行来自动执行工程任务以操作文件。该示例包括如何从现有工程文件创建引用工程、设置工程路径以及定义工程快捷方式。它还说明如何处理修改后的文件、依赖关系和标签。

打开工程

Times Table App 示例工程在 Git™ 源代码管理下。要创建工程对象,请使用 currentProjectopenProject

mainProject = openProject("TimesTableApp");

要检查工程启动问题,请使用 listStartupIssues 函数。

startupIssues = listStartupIssues(mainProject)
startupIssues = 

  1×0 Issue array with properties:

    ID
    Details
    ProblemFiles
    ProjectRoot
    Exception

检查工程文件

检查工程中的文件。

files = mainProject.Files
files=1×13 ProjectFile array with properties:
    Path
    Revision
    SourceControlStatus
    Labels

使用索引访问此列表中的文件。例如,获取编号为 9 的文件。每个文件都有说明其路径和附加的标签的属性。

mainProject.Files(9)
ans = 
  ProjectFile with properties:

                   Path: "/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/tests/tNewTimesTable.m"
               Revision: "867eda3463c6f8d78c59c7a042794d7bd4a39962"
    SourceControlStatus: Unknown
                 Labels: [1×1 matlab.project.Label]

获取编号为 9 的文件的 Git 最新修订版。

mainProject.Files(9).Revision
ans = 
"867eda3463c6f8d78c59c7a042794d7bd4a39962"

检查编号为 9 的文件的标签。

mainProject.Files(9).Labels
ans = 
  Label with properties:

            File: "/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/tests/tNewTimesTable.m"
        DataType: "none"
            Data: []
            Name: "Test"
    CategoryName: "Classification"

按名称获取特定文件。

myfile = findFiles(mainProject,"source/timestable.mlapp",OutputFormat="ProjectFile")
myfile = 
  ProjectFile with properties:

                   Path: "/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/source/timestable.mlapp"
               Revision: "867eda3463c6f8d78c59c7a042794d7bd4a39962"
    SourceControlStatus: Unmodified
                 Labels: [1×1 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 工程中的所有修改的文件。将此列表与“源代码管理”面板中的修改的文件部分进行比较。如果源代码管理图标不在边栏中,请点击“打开更多面板”Open more panels icon 按钮并添加它。

您可以看到新 Times Table Game 工程的文件,以及 Times Table App 工程中已删除和修改的文件。

modifiedfiles = listModifiedFiles(mainProject)
modifiedfiles=1×3 ProjectFile array with properties:
    Path
    Revision
    SourceControlStatus
    Labels

获取列表中的第二个修改的文件。注意 SourceControlStatus 属性为 AddedlistModifiedFiles 函数返回所添加、修改、删除以及发生冲突的任何文件。

modifiedfiles(2)
ans = 
  ProjectFile with properties:

                   Path: "/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/resources/project/LUgSFhI3RPozNzNcutxrczVe6f0/cgzuUNM-DiXWeIgQr0xgHZw1TxYd.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 ProjectFile array with properties:
    Path
    Revision
    SourceControlStatus
    Labels

获取文件依赖关系

运行依赖关系分析以更新工程文件之间的已知依赖关系。

updateDependencies(mainProject)

获取 Times Table App 工程中的依赖关系列表。Dependencies 属性包含工程文件之间的依赖关系图,存储为 MATLAB digraph 对象。

g = mainProject.Dependencies
g = 
  digraph with properties:

    Edges: [2×1 table]
    Nodes: [8×1 table]

获取 timestable.mlapp 文件所需的文件。

requiredFiles = bfsearch(g, which("source/timestable.mlapp"))
requiredFiles = 1×1 cell array
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/source/timestable.mlapp'}

获取图中所有类型的顶层文件。indegree 函数查找不被任何其他文件依赖的所有文件。

top = g.Nodes.Name(indegree(g)==0)
top = 7×1 cell
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/tests/tAnswerIsCorrect.m'               }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/tests/tCurrentQuestion.m'               }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/tests/tNewTimesTable.m'                 }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m'             }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m'   }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/runTheseTests.m'              }

获取具有依赖关系的顶层文件。indegree 函数查找不被任何其他文件依赖的所有文件,outdegree 函数查找具有依赖关系的所有文件。

top = g.Nodes.Name(indegree(g)==0 & outdegree(g)>0)
top = 2×1 cell
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m'             }

通过创建转置图查找影响的(即“上游”)文件。使用 flipedge 函数反转图中边的方向。

transposed = flipedge(g)
transposed = 
  digraph with properties:

    Edges: [2×1 table]
    Nodes: [8×1 table]

impacted = bfsearch(transposed,which("source/timestable.mlapp"))
impacted = 3×1 cell
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/source/timestable.mlapp'                }
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/requirements/TimesTableRequirements.mlx'}
    {'/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/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 Shortcut array with properties:
    Name
    Group
    File

检查列表中的快捷方式。

shortcuts(2)
ans = 
  Shortcut with properties:

     Name: "Edit Times Table App"
    Group: "Launch Points"
     File: "/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m"

获取快捷方式的文件路径。

shortcuts(3).File
ans = 
"/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m"

检查快捷方式列表中的所有文件。

{shortcuts.File}'
ans=4×1 cell array
    {["/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/source/timestable.mlapp"             ]}
    {["/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m"          ]}
    {["/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/openRequirementsDocument.m"]}
    {["/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/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: [1×0 matlab.project.LabelDefinition]

在新类别中定义一个新标签。

category = findCategory(mainProject,"Engineers");
createLabel(category,"Bob");

获取新标签的标签定义对象。

ld = findLabel(category,"Bob")
ld = 
  LabelDefinition with properties:

            Name: "Bob"
    CategoryName: "Engineers"

将标签附加到工程文件。标签将显示在“工程”面板的标签列中。

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/Bdoc25b_2988451_1319510/tpf56b86b6/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/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m"
        DataType: "double"
            Data: 2
            Name: "Sam"
    CategoryName: "Assessors"

查找所有具有标签 Sam 的文件。

SamFiles= findFiles(mainProject,label="Sam")
SamFiles = 
"/tmp/Bdoc25b_2988451_1319510/tpf56b86b6/matlab-ex45698718/TimesTableApp/utilities/editTimesTable.m"

关闭工程

关闭工程以运行关闭脚本并检查未保存的文件。

close(mainProject)

要检查工程关闭问题,请使用 listShutdownIssues 函数。

shutdownIssues = listShutdownIssues(mainProject)
shutdownIssues = 

  1×0 Issue array with properties:

    ID
    Details
    ProblemFiles
    ProjectRoot
    Exception

另请参阅

主题