in Sharpmake.Generators/VisualStudio/ProjectJson.cs [51:175]
private void GenerateProjectJson(Project.Configuration conf, DotNetFramework frameworks, List<string> generatedFiles, List<string> skipFiles)
{
var projectJsonPath = ProjectJsonPath;
var projectJsonLockPath = ProjectJsonLockPath;
// No NuGet references and no trace of a previous project.json
if (conf.ReferencesByNuGetPackage.Count == 0)
{
if (!File.Exists(projectJsonPath))
return;
}
lock (s_projectJsonLock)
{
if (conf.ReferencesByNuGetPackage.Count == 0)
{
var fi = new FileInfo(projectJsonPath);
if (!fi.IsReadOnly) // Do not delete project.json submitted in P4
{
Util.TryDeleteFile(projectJsonPath);
Util.TryDeleteFile(projectJsonLockPath);
}
return;
}
if (IsGenerateNeeded(projectJsonPath))
{
FileGenerator fileGenerator = new FileGenerator();
fileGenerator.Write(Template.Begin);
// frameworks
fileGenerator.Write(Template.FrameworksBegin);
DotNetFramework[] dnfs = ((DotNetFramework[])Enum.GetValues(typeof(DotNetFramework))).Where(f => frameworks.HasFlag(f)).ToArray();
for (int i = 0; i < dnfs.Length; ++i)
{
if (i != 0)
fileGenerator.Write(",");
using (fileGenerator.Declare("framework", dnfs[i].ToFolderName()))
fileGenerator.Write(Template.FrameworksItem);
}
fileGenerator.Write(Template.FrameworksEnd);
fileGenerator.Write(",");
// runtimes
fileGenerator.Write(Template.RuntimesBegin);
var runtimes = new[] { "win-x64", "win-x86", "win-anycpu", "win" };
for (int i = 0; i < runtimes.Length; ++i)
{
if (i != 0)
fileGenerator.Write(",");
using (fileGenerator.Declare("runtime", runtimes[i]))
fileGenerator.Write(Template.RuntimesItem);
}
fileGenerator.Write(Template.RuntimesEnd);
fileGenerator.Write(",");
// dependencies
fileGenerator.Write(Template.DependenciesBegin);
for (int i = 0; i < conf.ReferencesByNuGetPackage.SortedValues.Count; ++i)
{
if (i != 0)
fileGenerator.Write(",");
var packageReference = conf.ReferencesByNuGetPackage.SortedValues[i];
bool hasOptions = false;
// Check for private assets
string privateAssets = null;
if (packageReference.PrivateAssets != PackageReferences.DefaultPrivateAssets)
{
privateAssets = string.Join(",", PackageReferences.PackageReference.GetFormatedAssetsDependency(packageReference.PrivateAssets));
hasOptions = true;
}
// Check for a custom type
string referenceType = null;
if (!string.IsNullOrEmpty(packageReference.ReferenceType))
{
referenceType = packageReference.ReferenceType;
hasOptions = true;
}
if (!hasOptions)
{
using (fileGenerator.Declare("dependency", packageReference))
fileGenerator.Write(Template.DependenciesItem);
}
else
{
using (fileGenerator.Declare("dependency", packageReference))
{
fileGenerator.Write($"{Template.BeginDependencyItem}");
if (!string.IsNullOrEmpty(privateAssets))
{
using (fileGenerator.Declare("privateAssets", privateAssets))
fileGenerator.Write($"{Template.DependencyPrivateAssets}");
}
if (!string.IsNullOrEmpty(referenceType))
{
using (fileGenerator.Declare("referenceType", referenceType))
fileGenerator.Write($"{Template.DependencyReferenceType}");
}
fileGenerator.Write($"{Template.EndDependencyItem}");
}
}
}
fileGenerator.Write(Template.DependenciesEnd);
fileGenerator.Write(Template.End);
fileGenerator.RemoveTaggedLines();
bool written = _builder.Context.WriteGeneratedFile(GetType(), new FileInfo(projectJsonPath), fileGenerator);
if (written)
generatedFiles.Add(projectJsonPath);
else
skipFiles.Add(projectJsonPath);
}
}
IsGenerated = true;
}