2016-03-15 16:27:30 -07:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System ;
using System.Collections.Generic ;
using System.CommandLine ;
using Microsoft.DotNet.Cli.Utils ;
using System.IO ;
using System.Runtime.Versioning ;
using Microsoft.DotNet.ProjectModel ;
using Microsoft.Extensions.DependencyModel ;
using NuGet.Frameworks ;
using NuGet.Packaging ;
using NuGet.Versioning ;
using Microsoft.DotNet.ProjectModel.Graph ;
namespace RuntimeGraphGenerator
{
public class Program
{
public static int Main ( string [ ] args )
{
DebugHelper . HandleDebugSwitch ( ref args ) ;
string projectDirectory = null ;
string depsFile = null ;
IReadOnlyList < string > runtimes = null ;
try
{
ArgumentSyntax . Parse ( args , syntax = >
{
syntax . ApplicationName = "Runtime GraphGenerator" ;
syntax . HandleHelp = false ;
syntax . HandleErrors = false ;
syntax . DefineOption ( "p|project" , ref projectDirectory , "Project location" ) ;
syntax . DefineOption ( "d|deps" , ref depsFile , "Deps file path" ) ;
syntax . DefineParameterList ( "runtimes" , ref runtimes , "Runtimes" ) ;
} ) ;
}
catch ( ArgumentSyntaxException exception )
{
Console . Error . WriteLine ( exception . Message ) ;
return 1 ;
}
if ( runtimes = = null | | runtimes . Count = = 0 )
{
Reporter . Error . WriteLine ( "No runtimes specified" ) ;
return 1 ;
}
if ( ! File . Exists ( depsFile ) )
{
Reporter . Error . WriteLine ( $"Deps file not found: {depsFile}" ) ;
return 1 ;
}
if ( ! Directory . Exists ( projectDirectory ) )
{
Reporter . Error . WriteLine ( $"Project directory not found: {projectDirectory}" ) ;
return 1 ;
}
try
{
DependencyContext context ;
using ( var depsStream = File . OpenRead ( depsFile ) )
{
context = new DependencyContextJsonReader ( ) . Read ( depsStream ) ;
}
2016-03-23 14:51:03 -07:00
var framework = NuGetFramework . Parse ( context . Target . Framework ) ;
2016-03-15 16:27:30 -07:00
var projectContext = ProjectContext . Create ( projectDirectory , framework ) ;
// Configuration is used only for P2P dependencies so were don't care
var exporter = projectContext . CreateExporter ( "Debug" ) ;
var manager = new RuntimeGraphManager ( ) ;
var graph = manager . Collect ( exporter . GetDependencies ( LibraryType . Package ) ) ;
var expandedGraph = manager . Expand ( graph , runtimes ) ;
context = new DependencyContext (
2016-03-23 14:51:03 -07:00
context . Target ,
2016-03-15 16:27:30 -07:00
context . CompilationOptions ,
context . CompileLibraries ,
context . RuntimeLibraries ,
expandedGraph
) ;
using ( var depsStream = File . Create ( depsFile ) )
{
new DependencyContextWriter ( ) . Write ( context , depsStream ) ;
}
return 0 ;
}
catch ( Exception ex )
{
#if DEBUG
Reporter . Error . WriteLine ( ex . ToString ( ) ) ;
#else
Reporter . Error . WriteLine ( ex . Message ) ;
#endif
return 1 ;
}
}
}
}