Closed pranavkm closed 6 years ago
Related issue: https://github.com/aspnet/Razor/issues/1446
Finished investigation. Here are the findings,
Views.dll
contains our tag helper rendering logic that requires us to create unique ids for each tag helper call site. We currently do Guid.NewGuid()
to generate that here.Guid.NewGuid()
with the following,
// Use the file checksum along with the absolute position in the generated code to create a unique id for each tag helper call site
var checksum = BytesToString(context.SourceDocument.GetChecksum());
uniqueId = $"{checksum}{context.CodeWriter.Location.AbsoluteIndex}";
This change made the Views.dll
in subsequent builds deterministic.
@rynowak @pranavkm, the above code was a simple fix to make Razor builds deterministic. Thoughts?
This seems like a great fix 👍
Note that the reason for the unique id is that user-code can take a dependency on it. I believe that we did guids for this before, which would make it possible for users to write code that depends on parsing this guid.
Would it be possible to these bits (or a set of them) and format that as a guid?
There's a section about producing deterministic UUIDs - https://tools.ietf.org/html/rfc4122#section-4.3. Wix does something similar - producing deterministic GUIDs for a given relative path.
Okay yea then this should be a guid that can be parsed.
7f6b05149de4bf024f91eb49f8d5b131c600992a
From https://github.com/aspnet/Mvc/issues/7975
Is this a Bug or Feature request?: Bug
Steps to reproduce (preferably a link to a GitHub repo with a repro project):
/p:Deterministic=true
Project.Views.dll
andProject.dll
Project.dll
will have no difference whereasProject.Views.dll
will be differentDescription of the problem:
The razor compiled code is not deterministic. This means that building the same source code twice will result in different outputs. We use
/p:Deterministic=true
to ensure that our build output is the same for the same source code. This is super helpful in our Service Fabric applications where we do not bump the version number up when the code did not change for a service.Version of
Microsoft.AspNetCore.Mvc
orMicrosoft.AspNetCore.App
orMicrosoft.AspNetCore.All
:2.1.0
It looks like there is a
/deterministic+
flag set in the RazorCoreCompile but that doesn't seem to do what is expected?