Автоматизация задач проекта с помощью скриптов

В этом примере показано, как использовать API проекта для автоматизации задач проекта, манипулирующих файлами, включая работу с измененными файлами, зависимостями, ярлыками и метками.

Получите проект в командной строке

Откройте проект Airframe и используйте currentProject, чтобы получить объект проекта для манипулирования проектом в командной строке.

sldemo_slproject_airframe
proj = currentProject
Building with 'MinGW64 Compiler (C)'.
MEX completed successfully.

proj = 

  Project with properties:

                        Name: "Airframe Example"
    SourceControlIntegration: "Git"
          RepositoryLocation: "C:\workSpace\examples\repositories\airframe1"
       SourceControlMessages: [1×3 string]
                    ReadOnly: 0
                    TopLevel: 1
                Dependencies: [1×1 digraph]
                  Categories: [1×1 matlab.project.Category]
                       Files: [1×31 matlab.project.ProjectFile]
                   Shortcuts: [1×7 matlab.project.Shortcut]
                 ProjectPath: [1×7 matlab.project.PathFolder]
           ProjectReferences: [1×0 matlab.project.ProjectReference]
                StartupFiles: [1×0 string]
               ShutdownFiles: [1×0 string]
                 Description: "This is an example project.↵↵Use the "Project Shortcuts" toolstrip tab to find ways of getting started with this project."
                  RootFolder: "C:\workSpace\examples\airframe1"
       SimulinkCodeGenFolder: "C:\workSpace\examples\airframe1\work\codegen"
        ProjectStartupFolder: "C:\workSpace\examples\airframe1"
         SimulinkCacheFolder: "C:\workSpace\examples\airframe1\work\cache"

Поиск команд проекта

Узнайте, что вы можете сделать со своим проектом.

methods(proj)
Methods for class matlab.project.Project:

addFile                       listModifiedFiles             
addFolderIncludingChildFiles  listRequiredFiles             
addPath                       refreshSourceControl          
addReference                  reload                        
addShortcut                   removeCategory                
addShutdownFile               removeFile                    
addStartupFile                removePath                    
addprop                       removeReference               
close                         removeShortcut                
createCategory                removeShutdownFile            
export                        removeStartupFile             
findCategory                  runChecks                     
findFile                      updateDependencies            
isLoaded                      

Call "methods('handle')" for methods of matlab.project.Project inherited from handle.

Исследуйте файлы проекта

После получения объекта проекта можно изучить свойства проекта, такие как файлы.

files = proj.Files
files = 

  1×31 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

Используйте индексацию для доступа к файлам в этом списке. Следующая команда получает файл с номером 10. Каждый файл имеет свойства, описывающие его путь и присоединенные метки.

proj.Files(10)
ans = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe1\data\system_model.sldd"
                 Labels: [1×1 matlab.project.Label]
               Revision: "3e2de2b2a43515259c0843aacf330775d8fda493"
    SourceControlStatus: Unmodified

Исследуйте метки 10-го файла.

proj.Files(10).Labels
ans = 

  Label with properties:

            File: "C:\workSpace\examples\airframe1\data\system_model.sldd"
        DataType: 'none'
            Data: []
            Name: "Design"
    CategoryName: "Classification"

Получите конкретный файл по имени.

myfile = findFile(proj, 'models/AnalogControl.slx')
myfile = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe1\models\AnalogControl.slx"
                 Labels: [1×1 matlab.project.Label]
               Revision: "3e2de2b2a43515259c0843aacf330775d8fda493"
    SourceControlStatus: Unmodified

Узнайте, что можно сделать с файлом.

methods(myfile)
Methods for class matlab.project.ProjectFile:

addLabel     findLabel    removeLabel  

Получение измененных файлов

Измените файл модели проекта путем добавления произвольного блока.

open_system('AnalogControl')
add_block('built-in/SubSystem', 'AnalogControl/test')
save_system('AnalogControl')

Получите все измененные файлы в проекте. Наблюдайте два измененных файла. Сравните с представлением «Измененные файлы» в Project, где можно увидеть измененный файл модели и соответствующий файл определения проекта.

modifiedfiles = listModifiedFiles(proj)
modifiedfiles = 

  1×2 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

Получите второй измененный файл. Наблюдайте за файлом SourceControlStatus свойство изменено. Точно так же listModifiedFiles возвращает все добавленные, конфликтующие, удаленные и т.д. файлы, которые отображаются в представлении Измененные файлы в проекте.

modifiedfiles(2)
ans = 

  ProjectFile with properties:

                   Path: "C:\workSpace\examples\airframe1\resources\project\uuid-0988ac9d-5add-4cac-83a5-6a4af6c0cf34.xml"
               Revision: ""
    SourceControlStatus: Added

Обновите состояние системы контроля версий перед запросом отдельных файлов. Вам не нужно делать перед использованием listModifiedFiles .

refreshSourceControl(proj)

Получите все файлы проекта с определенным статусом системы контроля версий. Для примера получите файлы, которые Unmodified .

proj.Files(ismember([proj.Files.SourceControlStatus], matlab.sourcecontrol.Status.Unmodified))
ans = 

  1×22 ProjectFile array with properties:

    Path
    Labels
    Revision
    SourceControlStatus

Получите зависимости файла

Обновите зависимости файла. Проект запускает анализ зависимостей, чтобы обновить известные зависимости между файлами проекта.

updateDependencies(proj)

Получите список зависимостей в проекте Airframe. Свойство Dependencies содержит графиков зависимостей между файлами проекта, сохраненный как объект digraph MATLAB.

g = proj.Dependencies
g = 

  digraph with properties:

    Edges: [21×1 table]
    Nodes: [21×1 table]

Получите файлы, необходимые для модели.

requiredFiles = bfsearch(g, which('AnalogControl'))
requiredFiles =

  3×1 cell array

    {'C:\workSpace\examples\airframe1\models\AnalogControl.slx'}
    {'C:\workSpace\examples\airframe1\data\controller.sldd'    }
    {'C:\workSpace\examples\airframe1\data\buses.sldd'         }

Получите файлы верхнего уровня всех типов в графике.

g.Nodes.Name(indegree(g)==0);

Получите файлы верхнего уровня, которые имеют зависимости.

g.Nodes.Name(indegree(g)==0 & outdegree(g)>0)
ans =

  4×1 cell array

    {'C:\workSpace\examples\airframe1\models\DigitalControl.slx'}
    {'C:\workSpace\examples\airframe1\models\LinearActuator.slx'}
    {'C:\workSpace\examples\airframe1\models\slproject_f14.slx' }
    {'C:\workSpace\examples\airframe1\tests\f14_airframe_test.m'}

Найдите затронутые (или «восходящие») файлы путем создания транспонированного график.

transposed   = flipedge(g)
impacted = bfsearch(transposed, which('vertical_channel'))
transposed = 

  digraph with properties:

    Edges: [21×1 table]
    Nodes: [21×1 table]


impacted =

  4×1 cell array

    {'C:\workSpace\examples\airframe1\models\vertical_channel.slx'}
    {'C:\workSpace\examples\airframe1\models\f14_airframe.slx'    }
    {'C:\workSpace\examples\airframe1\models\slproject_f14.slx'   }
    {'C:\workSpace\examples\airframe1\tests\f14_airframe_test.m'  }

Поиск файлов, на которые влияет словарь данных.

impacted2 = bfsearch(transposed, which('buses.sldd'))
impacted2 =

  11×1 cell array

    {'C:\workSpace\examples\airframe1\data\buses.sldd'             }
    {'C:\workSpace\examples\airframe1\data\controller.sldd'        }
    {'C:\workSpace\examples\airframe1\data\system_model.sldd'      }
    {'C:\workSpace\examples\airframe1\tests\f14_airframe_test.m'   }
    {'C:\workSpace\examples\airframe1\models\AnalogControl.slx'    }
    {'C:\workSpace\examples\airframe1\models\DigitalControl.slx'   }
    {'C:\workSpace\examples\airframe1\models\f14_airframe.slx'     }
    {'C:\workSpace\examples\airframe1\models\LinearActuator.slx'   }
    {'C:\workSpace\examples\airframe1\models\NonLinearActuator.slx'}
    {'C:\workSpace\examples\airframe1\models\slproject_f14.slx'    }
    {'C:\workSpace\examples\airframe1\models\vertical_channel.slx' }

Получите информацию о ваших файлах, таких как количество зависимостей и сирот.

averageNumDependencies = mean(outdegree(g));
numberOfOrphans = sum(indegree(g)+outdegree(g)==0);

Если вы хотите внести изменения в иерархию модели, начиная с нижнего уровня вверх, найдите топологический порядок.

ordered = g.Nodes.Name(flip(toposort(g)));

Ярлыки запросов

Исследуйте свойство ярлыков проекта.

shortcuts = proj.Shortcuts
shortcuts = 

  1×7 Shortcut array with properties:

    Name
    Group
    File

Исследуйте ярлык в массиве.

shortcuts(7)
ans = 

  Shortcut with properties:

     Name: "Rebuild Project's S-functions"
    Group: "Utility"
     File: "C:\workSpace\examples\airframe1\utilities\rebuild_s_functions.m"

Получите путь к файлу ярлыка.

shortcuts(7).File
ans = 

    "C:\workSpace\examples\airframe1\utilities\rebuild_s_functions.m"

Исследуйте все файлы в массиве ячеек ярлыков.

{shortcuts.File}'
ans =

  7×1 cell array

    {["C:\workSpace\examples\airframe1\custom_tasks\analyzeModelFiles.m"]}
    {["C:\workSpace\examples\airframe1\custom_tasks\billOfMaterials.m"  ]}
    {["C:\workSpace\examples\airframe1\custom_tasks\checkCodeProblems.m"]}
    {["C:\workSpace\examples\airframe1\custom_tasks\runUnitTest.m"      ]}
    {["C:\workSpace\examples\airframe1\models\slproject_f14.slx"        ]}
    {["C:\workSpace\examples\airframe1\reports\slproject_f14.pdf"       ]}
    {["C:\workSpace\examples\airframe1\utilities\rebuild_s_functions.m" ]}

Файлы меток

Создайте новую категорию меток типа char. В проекте новая категория «Инженеры» появится на панели « Метках».

createCategory(proj, 'Engineers', 'char')
ans = 

  Category with properties:

                Name: "Engineers"
        SingleValued: 0
            DataType: "char"
    LabelDefinitions: [1×0 matlab.project.LabelDefinition]

Узнайте, что можно сделать с новой категорией.

category = findCategory(proj, 'Engineers');
methods(category)
Methods for class matlab.project.Category:

createLabel  findLabel    removeLabel  

Определите новую метку в новой категории.

createLabel(category, 'Bob');

Получите определение метки.

ld = findLabel(category, 'Bob')
ld = 

  LabelDefinition with properties:

            Name: "Bob"
    CategoryName: "Engineers"

Прикрепите метку к извлеченному файлу myfile. Если вы выбираете файл в Project, вы можете увидеть эту метку на панели редактора меток.

addLabel(myfile, 'Engineers', 'Bob');

Получите конкретную метку и прикрепите к ней данные, например, какой-нибудь текст.

label = findLabel(myfile, 'Engineers', 'Bob');
label.Data = 'Please assess'
label = 

  Label with properties:

            File: "C:\workSpace\examples\airframe1\models\AnalogControl.slx"
        DataType: 'char'
            Data: 'Please assess'
            Name: "Bob"
    CategoryName: "Engineers"

Можно задать переменную для данных меток, например:

mydata = label.Data
mydata =

    'Please assess'

Создайте новую категорию меток с типом числовых данных.

createCategory(proj, 'Assessors', 'double');
category = findCategory(proj, 'Assessors');
createLabel(category, 'Sam');

Присоедините новую метку к указанному файлу и присвойте значение данных 2 метке.

myfile = proj.Files(14);
addLabel(myfile, 'Assessors', 'Sam', 2)
ans = 

  Label with properties:

            File: "C:\workSpace\examples\airframe1\models"
        DataType: 'double'
            Data: 2
            Name: "Sam"
    CategoryName: "Assessors"

Закрыть проект

Закрытие проекта в командной строке аналогично закрытию проекта с помощью инструмента Project. Например, проект запускает скрипты завершения работы, а также проверяет несохраненные модели.

close(proj)

Дополнительная информация

Для получения дополнительной информации об использовании API введите: doc currentProject.

Для автоматизации задач запуска и завершения работы смотрите Automate Startup Tasks.

См. также

| | | |

Похожие темы