As you all may already know, ASP.NET MVC is open source and it is up on GitHub. The team has the entire framework out in the open so you can get familiar with it. What I like is we now get a real opportunity to learn the framework we love. How about, cloning the repo off of GitHub and setting a breakpoint? You will see the full request pipeline right in the call stack.
From reading the documentation, there is little on getting a build. This write up is to show you how to get there with zero drama.
How about a story? I once set up Express from source in a matter of minutes. I love how Express sets up their repo, you
npm install and
npm test and watch for green lights. The framework runs thousands of unit tests in seconds, all out in the open. I even set a breakpoint using NTVS in Visual Studio and saw a call stack that is flat and beautiful. Coming from such an awesome experience, I expected no less from the folks at Microsoft. But then it happened.
Rule #1: Don't Use Visual Studio
As a Windows developer, my initial attempt was to open
Mvc.sln in Visual Studio. What you will realize is that the solution does not build with
MSBuild. From my time figuring it out, it is using a custom build system called Sake. My recommendation is to not waste time figuring out Sake. We are here because we want to learn and might contribute to ASP.NET MVC, not its build mechanism.
So start in the command line with
git clone then
.\build.cmd inside the
Mvc directory. My initial crack at it showed many build perils. This led me to open an issue up on GitHub. From experience, the folks there are friendly and willing to get you up off the ground. If you experience issues with the build itself, I would let the team know so they can fix it.
If it all goes well, the build will compile and run all unit tests in minutes. Once done, open up C:\Users\<user> in explorer and peruse through .dnx.
DNVM First, DNX Second
You might start thinking, now what? You've got this colossal code base in your machine with no end in sight. You may start to feel stranded at sea. Look to the right and all you see is code, look left and yes, more code. One way I like to get situated is to check out the unit tests. But first, let's discuss the
DNVM is the versioning system for the DNX runtime. Start by typing
dnvm list. If there isn't a star next to any runtime environment, try
dnvm use default. The build installs the runtimes and you must
use one to run tests. In my current setup, the
default is sufficient but you may need to set it up yourself. Typing up
dnvm without arguments reveals how to use it. There is documentation out there that covers the basics.
As a warning, once you get a working build, don't f*** with it! Building more than once downloads the latest packages and runtimes which may fail. Trust me, it is a rat race you don't want to be in. DNX will “compile” code changes on the fly with Rosyln. The initial build is just to get the whole system up off the ground.
Now that you have selected a suitable runtime, do this in the
> cd test\Microsoft.AspNet.Mvc.Core.Test
> dnx test
> dnx test -method Microsoft.AspNet.Mvc.Controllers
To know where the
-method flag came from, type
dnx test -? to see the full list of command line options.
Set a Breakpoint!
You may start wondering, tests pass so what? Remember rule #1? It was a temporary commandment made for fulfillment. You didn't think Visual Studio would be obsolete now, did you? Time to fire up Mvc.sln inside Visual Studio.
Once inside the solution, find Controllers\DefaultControllerFactoryTest.cs:102 in the folder above and set a breakpoint. Now, it is time to fire the test in DNX:
> dnx --debug test -method Microsoft.AspNet.Mvc.Controllers
--debug flags tells DNX to wait. Go to Visual Studio and attach to the proper process id. Once done, you should see it hit the breakpoint.
Amazing, huh? How about more awesomeness? Set a breakpoint inside
MvcMinimalSample.Web\HomeController.cs:10. This should be the home controller of a minimal MVC app. Type this up inside the
> cd samples\MvcMinimalSample.Web
> dnx --debug web
The prompt waits for you to attach then visit
http://localhost:5000 in the browser. BAM! That should hit the controller with a full blown call stack.
Feel free to explore around the stack, you can move up and down. See how the request pipeline invokes the controller. The
FilterActionInvoker creates the controller. It is actually making my controller, too beautiful to describe in words.
The full ASP.NET MVC stack is out in the open and the team has been making strides towards transparency. What I like the most is now you and I get a say in all this. It is like having input in the future of our careers. ASP.NET is a well respected stack in the enterprise and its future looks bright. My recommendation is learn the guts and bolts of this awesome framework. Perhaps, you'll learn what makes it great and integrate that into your own practice.
The post Build ASP.NET MVC from Source Code appeared first on BeautifulCoder.NET.