I found that there are a couple of ways to do that.
- Deployable package Best option for deployment. All models you wrote will be compiled to binary and put in a package. This package can be sent and deployed on other environment. With the Extension concept, I found that this way is very powerful and effortless. However please note that it is NOT included X++ source code or others you did on Visual Studio! See https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/deployment/create-apply-deployable-package
- Models (.axmodel) Best option for Dev source code and metadata exchange. MS said "Model files let you distribute models to customers and partners, and can be installed in development environments. ...Model files contain a model descriptor file, metadata, source code, and referenced .NET assemblies (when applicable). ..". You can see all Dev stuffs you need can be done by this way. See https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/models-export-import
- Projects (.axpp) axpp would stand for ax Project Package. This is very similar to xpo in the old version. Still useful because importing models doesn't include the project description like xpo did. So by many cases, it will be used together with the above importing models. See https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/projects#export-a-projects-as-an-axpp-file
So the question is when we use them.
Scenario1 If you'd like to deploy only the functionalities (the application) to the end-users, customers or UAT environment. And the source code doesn't need, then >> Deployable package.
Scenario2 If you would like to copy or move the dev environment where you need the soure code and metadata, then >> importing Models (and importing Projects -- optional).
Thanks for reading!