Dependencies between different Business Central apps are often a hurdle throughout the development process. This is the case with both, development on your local computer and CI/CD in Azure Pipelines. There are several approaches to manage these dependencies, which in turn have different sets of advantages and disadvantages.
The first and probably worst solution to the problem is, to manage the dependencies directly in the git repository. This solution is apparently easy to implement and ensures that there is always the most recent version of the app. The problem with this approach is that git is not very efficient at managing binary files. Binary files cannot be significantly compressed or optimized. This results in an significant size increase of all dependent repositories everytime a new version is published. The problem gets increasingly worse the more dependencies you have and the deeper the dependency tree is.
You got to remember that all of your repos in Azure DevOps should not exceed 10 GB…
Repositories should generally be no larger than 10GB.(source: Git limits - Azure Repos| Microsoft Docs)
But even before you reach the maximum size, problems can occur when cloning repos.
Even if you add just one dependency you will have to manually duplicate that dependency for all other dependent apps in the tree which will be time-consuming.
The second option is to manually download from a central storage. This approach eliminates all the size restrictions of the first “solution”. However, adding one dependency will still take a considerable effort because you need to add that app to all dependent apps (not only the direct ones).
You can see that adding App 7 as a dependency for App 3 means that you have to carry the dependency to all dependent apps (App 3, 5 and 6).
To solve the issue we've added functionality to Freddy's BCContainerHelper that recursively resolves dependencies just from your app.json without any further configuration. To use this functionality you need to publish all your apps to Azure Feed which can be done by using the function Publish-BuildOutputToAzureFeed which publishes the result of the build into the Azure Feed. This way all dependencies are stored in one place and in a structured way.
These apps can be downloaded using the Resolve-DependenciesFromAzureFeed function.
The dependencies in app.json are analyzed and downloaded recursively. There is no need to maintain the dependencies in a different settings file than the already defined configuration in the app.json.
You can see that adding App 7 as a dependency for App 3 means that you only need to add the dependency to the app.json of App 3. After App 7 and App 3 are updated in the Azure Feed and the Resolve-DependenciesFromAzureFeed function is executed for App 5 and 6, it will automatically download App 7 (as it is a dependency for App 3).
Using the already integrated functionality of the BCContainerHelper will let you manage dependencies with ease – even in giant dependency trees.