2015-11-16 11:21:57 -08: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.
2015-10-13 14:31:29 -07:00
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
2015-11-27 16:19:54 -08:00
using Microsoft.DotNet.ProjectModel.Compilation ;
using Microsoft.DotNet.ProjectModel.Resolution ;
2015-10-13 14:31:29 -07:00
using NuGet.Frameworks ;
2015-11-27 16:19:54 -08:00
namespace Microsoft.DotNet.ProjectModel
2015-10-13 14:31:29 -07:00
{
public class ProjectContext
{
public GlobalSettings GlobalSettings { get ; }
public ProjectDescription RootProject { get ; }
public NuGetFramework TargetFramework { get ; }
public string RuntimeIdentifier { get ; }
2015-10-15 12:56:07 -07:00
public Project ProjectFile = > RootProject . Project ;
2015-10-13 14:31:29 -07:00
public string RootDirectory = > GlobalSettings . DirectoryPath ;
2015-10-15 12:56:07 -07:00
public string ProjectDirectory = > ProjectFile . ProjectDirectory ;
2015-10-13 14:31:29 -07:00
public string PackagesDirectory { get ; }
public LibraryManager LibraryManager { get ; }
internal ProjectContext (
GlobalSettings globalSettings ,
ProjectDescription rootProject ,
NuGetFramework targetFramework ,
string runtimeIdentifier ,
string packagesDirectory ,
LibraryManager libraryManager )
{
GlobalSettings = globalSettings ;
RootProject = rootProject ;
TargetFramework = targetFramework ;
RuntimeIdentifier = runtimeIdentifier ;
PackagesDirectory = packagesDirectory ;
LibraryManager = libraryManager ;
}
public LibraryExporter CreateExporter ( string configuration )
{
return new LibraryExporter ( RootProject , LibraryManager , configuration ) ;
}
/// <summary>
/// Creates a project context for the project located at <paramref name="projectPath"/>,
/// specifically in the context of the framework specified in <paramref name="framework"/>
/// </summary>
public static ProjectContext Create ( string projectPath , NuGetFramework framework )
{
return Create ( projectPath , framework , Enumerable . Empty < string > ( ) ) ;
}
/// <summary>
/// Creates a project context for the project located at <paramref name="projectPath"/>,
/// specifically in the context of the framework specified in <paramref name="framework"/>
/// and the candidate runtime identifiers specified in <param name="runtimeIdentifiers"/>
/// </summary>
public static ProjectContext Create ( string projectPath , NuGetFramework framework , IEnumerable < string > runtimeIdentifiers )
{
2015-12-02 23:32:27 -08:00
if ( projectPath . EndsWith ( Project . FileName ) )
2015-10-13 14:31:29 -07:00
{
projectPath = Path . GetDirectoryName ( projectPath ) ;
}
return new ProjectContextBuilder ( )
2015-10-29 01:35:23 -07:00
. WithProjectDirectory ( projectPath )
. WithTargetFramework ( framework )
. WithRuntimeIdentifiers ( runtimeIdentifiers )
. Build ( ) ;
2015-10-13 14:31:29 -07:00
}
/// <summary>
/// Creates a project context for each framework located in the project at <paramref name="projectPath"/>
/// </summary>
2015-12-09 00:47:57 -08:00
public static IEnumerable < ProjectContext > CreateContextForEachFramework ( string projectPath , ProjectReaderSettings settings = null )
2015-10-13 14:31:29 -07:00
{
2015-12-02 23:32:27 -08:00
if ( ! projectPath . EndsWith ( Project . FileName ) )
2015-10-13 14:31:29 -07:00
{
projectPath = Path . Combine ( projectPath , Project . FileName ) ;
}
2015-12-04 18:03:57 -08:00
var project = ProjectReader . GetProject ( projectPath , settings ) ;
2015-10-13 14:31:29 -07:00
2015-12-02 23:32:27 -08:00
foreach ( var framework in project . GetTargetFrameworks ( ) )
2015-10-13 14:31:29 -07:00
{
yield return new ProjectContextBuilder ( )
2015-10-29 01:35:23 -07:00
. WithProject ( project )
. WithTargetFramework ( framework . FrameworkName )
2015-12-09 00:47:57 -08:00
. WithReaderSettings ( settings )
2015-10-29 01:35:23 -07:00
. Build ( ) ;
2015-10-13 14:31:29 -07:00
}
}
2015-12-02 23:32:27 -08:00
/// <summary>
/// Creates a project context for each target located in the project at <paramref name="projectPath"/>
/// </summary>
public static IEnumerable < ProjectContext > CreateContextForEachTarget ( string projectPath )
{
if ( ! projectPath . EndsWith ( Project . FileName ) )
{
projectPath = Path . Combine ( projectPath , Project . FileName ) ;
}
var project = ProjectReader . GetProject ( projectPath ) ;
return new ProjectContextBuilder ( )
. WithProject ( project )
. BuildAllTargets ( ) ;
}
2015-11-30 16:24:03 -08:00
public string GetAssemblyPath ( string buildConfiguration )
{
return Path . Combine (
GetOutputDirectoryPath ( buildConfiguration ) ,
ProjectFile . Name + FileNameSuffixes . DotNet . DynamicLib ) ;
}
public string GetPdbPath ( string buildConfiguration )
{
return Path . Combine (
GetOutputDirectoryPath ( buildConfiguration ) ,
ProjectFile . Name + FileNameSuffixes . DotNet . ProgramDatabase ) ;
}
2015-12-08 11:30:25 -08:00
public string GetOutputDirectoryPath ( string buildConfiguration )
2015-11-30 16:24:03 -08:00
{
2015-12-08 11:30:25 -08:00
var outDir = Path . Combine (
2015-11-30 16:24:03 -08:00
ProjectDirectory ,
DirectoryNames . Bin ,
buildConfiguration ,
2015-12-08 11:30:25 -08:00
TargetFramework . GetShortFolderName ( ) ) ;
if ( ! string . IsNullOrEmpty ( RuntimeIdentifier ) )
{
outDir = Path . Combine ( outDir , RuntimeIdentifier ) ;
}
return outDir ;
2015-11-30 16:24:03 -08:00
}
2015-10-13 14:31:29 -07:00
}
2015-12-02 23:32:27 -08:00
}