In order to do automated builds in Azure DevOps with the .NET MAUI Release Candidate release, we need a few extra steps in the pipeline configuration. I used these steps to ensure that the NuGet packages I develop are automatically compiled and uploaded to NuGet.org. In this article I won’t go into detail about how to create a CI pipeline, I just want to show you the difference from a normal CI pipeline. I haven’t tried building and deploying applications in the cloud at the moment, but it can probably be done. Also, I don’t go into how to make the package automatically go to NuGet.org, for that I recommend an earlier article (and also how to create a CI/CD pipeline): https://www.banditoth.net/2021/11/09/azure-devops-setup-private-nuget-feed-with-ci/
Since a final version of .NET MAUI has not been released as of today, in order to build our applications in the cloud, we need to install the MAUI Workload on the Agent. If we do not do this, we may encounter the following error:
Error NETSDK1147: To build this project, the following workloads must be installed: maui-windows
Adjust your pipeline
In order to install the workload on our build agent, create a new task at the very beginning in the pipeline file, which is executes a command in the command line:
This will result the following task in the yaml file:
The installation of the workload will take about 5 minutes.
From now on, you will be able to use .NET Maui references on the pipelines too. This will let you build your packages in the cloud. Once MAUI will be officially available, probably you don’t need these steps.
In case you need a private NuGet feed, you can do it in Azure DevOps. This can be handy for businesses reusing their code between several codebases.
What will contain the example
In this tutorial, I will show you how to share code through NuGet packages so that it can be used in multiple projects. The Example will walk you through the game engine of an IDLE game. IDLE games are games that do not require much user interaction. The point of games is that they run or produce even when the user is not playing them. The goods produced offline can eventually be used by the player, to upgrade producers or to buy more producers.
The game engine is developed on the IDLEGAMEENGINE branch. Different games, such as a restaurant game or a programming game, can use this game engine. The games have a common logic of operation, only the story of the games differs. This design helps in development to fix bugs by only having to fix the bug in one place and it will be fixed in all games.
Step 0: Create your shared code
I will not go into details about the implementation of the game engine in this tutorial. The point is to create source code that you want to share with other source code.
Step 1: Create the NuGet feed
Go to your projects Azure DevOps site, and select Artifacts from the list on the left. Push the Create feed button. You can select from several visibility options for the new feed.
Step 2. Automate NuGet package publish to the feed
You probably have a repository with the code, what you want to share. Go To Pipelines on the left, then create a pipeline to get NuGet packages published automatically. (If you are experienced, you can make Release pipelines) In the following sections, i will guide you through how to make a CI pipeline, to pack and publish the NuGet packages automatically every time the main branch gets updated.
Navigate to Pipelines section
Go to pipelines and Select create pipeline button.
Select where do you store the code what you want to publish to your private NuGet feed. In my case, I store the GameEngine code in Azure DevOps, so I will continue with this.
Select the Repository which contains the code to be shared.
Select the desired build template for the project. I’ve implemented the core code in .NET Core, so i will continue with ASP.NET Core.
By default this template creates you a NuGetToolInstaller task, a Nugetcommand Task, and a VS Build task.
We will add a 4th task which can be added by searching for NuGet task.
Set up the tasks parameters as the following: Command should be push. The path to the NuGet packages to publish should be the path where the VSBuild builds the application.
Select the target feed location properly. My target feed is at the same organization, so it will appear in the dropdown list. For External NuGet server, you will need to specify a connector to that resource.
Ensure that, the NuGet package will only build, when the csproj is configured to build as a NuGet package. You will need the following settings for your project in order to make a NuGet from it.
Save the pipeline and run it. If you have configured everything correctly, you will see a lot of green ticks in the progress window
This seems to be well configured
When you navigate to the Artifacts/Packages section, you will see that the NuGet package has been pushed successfully to the private feed.
The recently pushed NuGet will appear here
Step 3.: Use your private repository on your projects
In order to use the recently updated package, you will need to set up your local Visual Studio instance to be able to use your private feed.
Adding a new package source
Go to your VS settings, select the NuGet section, and click on the Sources subsection. Click On add and define the connection details presented by clicking the “Connect to feed” button in the Azure DevOps / artifacts section.
Once you have configured the Visual Studio well, you will see the NuGet Package available when you are trying to add a new package to your proejct.
This content has 6 months. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.
Amennyiben azt feltételezzük, hogy a Visual Studio a nugetek cachelése miatt nem működik úgy, ahogy az elvárt lenne, abban az esetben lehetőségünk van a lokális cache-t üríteni.
This content has 2 years. Some of the information in this post may be out of date or no longer work. Please, read this page keeping its age in your mind.
Cookie settings
We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept”, you consent to the use of ALL the cookies.
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. These cookies ensure basic functionalities and security features of the website, anonymously.
Cookie
Duration
Description
cookielawinfo-checbox-analytics
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics".
cookielawinfo-checbox-functional
11 months
The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional".
cookielawinfo-checbox-others
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other.
cookielawinfo-checkbox-necessary
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary".
cookielawinfo-checkbox-performance
11 months
This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance".
viewed_cookie_policy
11 months
The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data.
Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics the number of visitors, bounce rate, traffic source, etc.
Cookie
Duration
Description
_ga
2 years
Google Analytics : Used to distinguish users.
_gat
1 minute
Google Analytics
_gid
24 hours
Google Analytics : Used to distinguish users.
AMP_TOKEN
30 seconds to 1 year
Google Analytics: Contains a token that can be used to retrieve a Client ID from AMP Client ID service. Other possible values indicate opt-out, inflight request or an error retrieving a Client ID from AMP Client ID service.