jmurphyweb
I have a case of cyclical compile time dependencies. I have read lot’s about it and watched the great video on youtube.
Updating a View or Controller or many other files causes a 70 module recompile. I have discovered that my extensive (ab)use of controller level plugs is one cause, but there are others, such as an over-imported ViewHelpers module. I am slowly but surely removing imports, which I think is getting me closer to resolving this issue ![]()
My question is, from an xref graph or another tool out there, is it possible to ascertain whether there is a cyclical dependency issue ? I am wondering whether I could run a check to my CI to ensure we never get into this position again.
lib/ev2_web/views/production/custom_field_view.ex
├── lib/ev2_web.ex (compile)
├── lib/ev2_web/router.ex
│ ├── lib/ev2_web/controllers/dashboard_controller.ex
│ │ ├── lib/ev2_web.ex (compile)
│ │ ├── lib/ev2_web/controllers/data_plugs.ex (compile)
│ │ │ ├── lib/ev2/accounts/accounts.ex
│ │ │ │ ├── lib/ev2/accounts/core_logic.ex (compile)
│ │ │ │ ├── lib/ev2/accounts/login_attempt/login_attempt_api.ex (compile)
│ │ │ │ │ ├── lib/ev2/accounts/accounts.ex
│ │ │ │ │ ├── lib/ev2/accounts/login_attempt/login_attempt.ex (struct)
│ │ │ │ │ │ └── lib/ev2/accounts/user/user.ex
│ │ │ │ │ │ ├── lib/ev2/accounts/login_attempt/login_attempt.ex
│ │ │ │ │ │ ├── lib/ev2/accounts/role/project_role.ex
│ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role.ex
│ │ │ │ │ │ │ │ └── lib/ev2/accounts/role/permission.ex
│ │ │ │ │ │ │ │ └── lib/ev2/accounts/role/role.ex
│ │ │ │ │ │ │ ├── lib/ev2/accounts/user/user.ex
│ │ │ │ │ │ │ └── lib/ev2/production/department/department.ex
│ │ │ │ │ │ │ └── lib/ev2/production/job_title/job_title.ex
│ │ │ │ │ │ │ ├── lib/ev2/production/contract_type/contract_type.ex
│ │ │ │ │ │ │ │ └── lib/ev2/production/job_title/job_title.ex
│ │ │ │ │ │ │ └── lib/ev2/production/department/department.ex
│ │ │ │ │ │ ├── lib/ev2/accounts/role/role.ex
│ │ │ │ │ │ ├── lib/ev2/accounts/startpack/startpack.ex
│ │ │ │ │ │ │ ├── lib/ev2/accounts/user/user.ex
│ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/upcase.ex (compile)
│ │ │ │ │ │ │ ├── lib/ev2/lib/doc_security/doc_security.ex
│ │ │ │ │ │ │ │ ├── lib/ev2/lib/doc_security/anti_virus/anti_virus.ex (compile)
│ │ │ │ │ │ │ │ └── lib/ev2/lib/doc_security/file_type/file_type.ex (compile)
│ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ ├── lib/ev2/lib/doc_security/doc_security.ex
│ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/time_utils.ex
│ │ │ │ │ │ │ │ ├── lib/ev2/timecards/tc_utils.ex
│ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/time_utils.ex
│ │ │ │ │ │ │ │ │ ├── lib/ev2/production/prod_utils.ex
│ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approver/approver.ex (struct)
│ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex (struct)
│ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/time_utils.ex
│ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approval/approval.ex
│ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approver/approver.ex
│ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex
│ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecard_data/timecard_data.ex
│ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/production.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/altered_document/altered_document_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/altered_document/altered_document.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/altered_document/altered_document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/offer/offer.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/accounts.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/helpers.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/project_role.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/permission.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_permission.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/permission.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/accounts/role/role.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/altered_document/altered_document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/constants.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/contract_type/contract_type.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/custom_field/custom_field.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/offer/offer.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/constants.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/custom_field/custom_field.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/offer/offer.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/place/place.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/production.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/project_default/project_default.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/signee/signee.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/vehicle/vehicle.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/ecto_types/string/trim.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/company/company.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/vehicle/vehicle.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/department/department.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/department_inclusive/department_inclusive.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/frozen_document/frozen_document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/offer/offer.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/job_title/job_title.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/place/place.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/prod_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/production.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/project/project.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/signee/signee.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/offer/offer.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/offer/offer.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/company/company_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/company/company.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/contract_type/contract_type_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/contract_type/contract_type.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/contract_type/contract_type_helpers.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/prod_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/custom_field/custom_field_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/custom_field/custom_field.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/department/department_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/department/department.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/job_title/job_title.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/doc_security/doc_security.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/production.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document_signee/document_signee_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document_signee/document_signee.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/production/signee/signee.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/frozen_document/frozen_document_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/frozen_document/frozen_document.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/job_title/job_title_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/job_title/job_title.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/offer/offer_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/accounts.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/user/user.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/engagements.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/eng_utils.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/time_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approval/approval_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approval/approval.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approval/validate.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approver/approver.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approver/approver_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/project_role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/accounts.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/project_role.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/user/user.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/project/project.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/approver/approver.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard_setting/timecard_setting.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/production.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard_setting/timecard_setting_constants.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/department_inclusive/department_inclusive_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/department/department.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/department_inclusive/department_inclusive.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/changeset.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/department/department.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/department_inclusive/department_inclusive.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/regular_site/regular_site.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/department_inclusive/department_inclusive.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecard_setting/timecard_setting.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/export/export_api.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/user/user.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/engagements.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/repo.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/export/export.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/timecards/timecard_setting/timecard_setting.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/timecards/timecard_approval_view.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/eng_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/humanize.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/time_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/prod_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/tc_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecard/timecard.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/timecards.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/endpoint.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/controllers/block_direct_heroku_access.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2_web/router.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/router.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/component_view.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/lib/utils/humanize.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/prod_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/timecards/tc_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/router.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/error_helpers.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2_web/gettext.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/production/document_view.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/altered_document/altered_document.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/production/document/document.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/router.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/component_view.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2_web/views/error_helpers.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └── lib/ev2_web/views/view_helpers.ex (compile)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/accounts/role/role_api.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/eng_utils.ex
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/engagement/engagement.ex (struct)
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── lib/ev2/engagement/ot_setting/ot_setting.ex
...
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself.
My main conc...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 7- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
jmurphyweb
Am I right in thinking that this is a likely cause of an overly compile-time dependent structure:
As the data plugs is reliant on a lot of other modules at runtime and is a compile time dependency of one or more other modules.
Obviously this isn’t necessarily a circular dependency, which I still don’t know if we can necessarily tell from looking at an xref graph?
Any thoughts would be appreciated.
benwilson512
Hi @jmurphyweb. I also have an issue where a large number of files are recompiled when I make even trial changes to many files (like adding or removing a comment). I don’t think that phrasing this as a “circular compile time dependency” though is helping, because if it were actually that then you’d have gridlock at compile time and get an actual error.
For example, these modules have a true compile time dependency on each other:
If I try to compile these, I get:
jmurphyweb
Thanks a lot for the reply.
How are you coping!!!
Do think theres space for a tool that
a. prevents this issue from occurring in projects
b. if you have this issue, does. a clearer job of identifying the problem areas.
?
The circular dependency idea was taken from this video.
Sorry if that terminology is incorrect or misleading.
outlog
just checking that you are on latest phoenix? there was a bug in regards to plugs Do plugs always create compile time dependency? - #2 by josevalim - fixed in phoenix 1.4.15..
jmurphyweb
@outlog thanks! That is my own thread actually
- I am not using the latest version, but my data plugs are function plugs, which this does not apply to unfortunately (only to Module plugs).
I have found the cause of my problems (eventually). This question is more about understanding if it is possible to know from analysing xref graph whether an issue exists, and if so, where.
christhekeele
Just to be clarify, you aren’t suffering from a cyclical dependency issue, this is incorrect terminology. A cyclical dependency refers very specifically to a ‘cycle’ in the dependency graph. Elixir doesn’t support cyclical module dependencies and would refuse to compile in this situation (as @benwilson512 explains well here).
You seem to be concerned more about depth of your module dependency graph, rather than cycles. That’s a pretty cool idea! As far as I can tell,
mix xrefhas access to this information (it must in parsing the module graph), but doesn’t report on it (anywhere I can find in its documentation). That would make a nifty PR or proposal.jmurphyweb
Really helpful, thanks a lot. I’d love to define what is possible and helpful so that I could have a crack at creating something. I think it’s unlikey for me to get something merged into XREF, but just for ease of communicating:
One suggestion:
I’d like to be able to use xref to work out which modules/files will be recompiled when I change a certain file eg:
lib/my_app_web/router.exFor the sake of explanation, let’s assume we had an additional
--labelavailable:mix xref graph --sink lib/my_app_web/router.ex --label cause-recompileWhat does it do?:
From the docs:
But from what I understand, this only creates a list of explicit compile-time dependancies (eg. via
import,defdelegate,useCurrent tool:
Meaning in my project, when I run:
mix xref graph --sink lib/my_app_web/router.ex --label compileNo files are returned.
In reality:
However, running:
echo '#' > ./lib/my_app_web/router.ex && mix compile --verboseRecompiles 3 files:
Proposal:
So running the following:
mix xref graph --sink lib/my_app_web/router.ex --label cause-recompileWould return
Why does it help?:
I think this would have helped me recently in that I could have easily analysed the current state of my actual compile time dependencies (explicit and implicit) without manually making a change and running the
mix compile --verbosecommand.It would also potentially be possible to quickly expose a list of modules that have many explicit & implicit compile time dependencies similar to the
--format statsoptionHow to achieve?:
I want to know if it is possible to ascertain implicit compile time dependencies from analysing the xref graph. So far I have not been able to work it out, but maybe someone else out there can shed some light?
If that is not possible, then I assume that compiler-tracers would be the way to go.
In my examples above, the
mix xref graph --sink lib/my_app_web/router.ex(without label) produces a huge list of dependencies, but here is a truncated version:If anyone has any thoughts on:
Then I’d love to hear back