@@ -19,31 +19,49 @@ public class ScriptPublisher
19
19
private readonly ScriptEmitter _scriptEmitter ;
20
20
private readonly ScriptConsole _scriptConsole ;
21
21
private readonly ScriptEnvironment _scriptEnvironment ;
22
+ private readonly ScriptLogger _logger ;
22
23
23
- public ScriptPublisher ( ScriptProjectProvider scriptProjectProvider , ScriptEmitter scriptEmitter , ScriptConsole scriptConsole )
24
+ public ScriptPublisher ( ScriptProjectProvider scriptProjectProvider , ScriptEmitter scriptEmitter , ScriptConsole scriptConsole ,
25
+ ScriptLogger scriptLogger )
24
26
{
25
27
_scriptProjectProvider = scriptProjectProvider ?? throw new ArgumentNullException ( nameof ( scriptProjectProvider ) ) ;
26
28
_scriptEmitter = scriptEmitter ?? throw new ArgumentNullException ( nameof ( scriptEmitter ) ) ;
27
29
_scriptConsole = scriptConsole ?? throw new ArgumentNullException ( nameof ( scriptConsole ) ) ;
28
30
_scriptEnvironment = ScriptEnvironment . Default ;
31
+ _logger = scriptLogger ;
29
32
}
30
33
31
- public ScriptPublisher ( LogFactory logFactory , ScriptEmitter scriptEmitter )
34
+ public ScriptPublisher ( LogFactory logFactory , ScriptEmitter scriptEmitter , ScriptLogger scriptLogger )
32
35
: this
33
36
(
34
37
new ScriptProjectProvider ( logFactory ) ,
35
38
scriptEmitter ,
36
- ScriptConsole . Default
39
+ ScriptConsole . Default ,
40
+ scriptLogger
37
41
)
38
42
{
39
43
}
40
44
45
+ public void CreateAssembly ( ScriptContext context , LogFactory logFactory )
46
+ {
47
+ Directory . CreateDirectory ( context . WorkingDirectory ) ;
48
+
49
+ _logger . Verbose ( "Publishing dll" ) ;
50
+ CreateScriptAssembly ( context , context . WorkingDirectory ) ;
51
+
52
+ var tempProjectPath = ScriptProjectProvider . GetPathToProjectFile ( Path . GetDirectoryName ( context . FilePath ) ) ;
53
+ var tempProjectDirecory = Path . GetDirectoryName ( tempProjectPath ) ;
54
+ var sourceProjectAssetsPath = Path . Combine ( tempProjectDirecory , "obj" , "project.assets.json" ) ;
55
+ var destinationProjectAssetsPath = Path . Combine ( context . WorkingDirectory , "project.assets.json" ) ;
56
+ File . Copy ( sourceProjectAssetsPath , destinationProjectAssetsPath , overwrite : true ) ;
57
+ }
58
+
41
59
public void CreateExecutable ( ScriptContext context , LogFactory logFactory )
42
60
{
43
- var tempProjectPath = _scriptProjectProvider . CreateProjectForScriptFile ( context . FilePath ) ;
61
+ var tempProjectPath = ScriptProjectProvider . GetPathToProjectFile ( Path . GetDirectoryName ( context . FilePath ) ) ;
44
62
var tempProjectDirecory = Path . GetDirectoryName ( tempProjectPath ) ;
45
63
46
- var scriptAssemblyPath = CreateScriptAssembly ( context , tempProjectDirecory ) ;
64
+ var scriptAssemblyPath = CreateScriptAssembly ( context , tempProjectDirecory , true ) ;
47
65
48
66
var projectFile = new ProjectFile ( File . ReadAllText ( tempProjectPath ) ) ;
49
67
projectFile . AddPackageReference ( new PackageReference ( "Microsoft.CodeAnalysis.Scripting" , ScriptingVersion , PackageOrigin . ReferenceDirective ) ) ;
@@ -56,39 +74,43 @@ public void CreateExecutable(ScriptContext context, LogFactory logFactory)
56
74
57
75
var commandRunner = new CommandRunner ( logFactory ) ;
58
76
// todo: may want to add ability to return dotnet.exe errors
77
+ _logger . Verbose ( "Publishing exe" ) ;
59
78
var exitcode = commandRunner . Execute ( "dotnet" , $ "publish \" { tempProjectPath } \" -c Release -r { runtimeIdentifier } -o { context . WorkingDirectory } ") ;
60
79
if ( exitcode != 0 ) throw new Exception ( $ "dotnet publish failed with result '{ exitcode } '") ;
61
80
}
62
81
63
- private string CreateScriptAssembly ( ScriptContext context , string tempProjectDirecory )
82
+ private string CreateScriptAssembly ( ScriptContext context , string outputDirectory , bool useAssemblyName = false )
64
83
{
65
84
try
66
85
{
67
- var emitResult = _scriptEmitter . Emit < int > ( context , AssemblyName ) ;
86
+ var emitResult = _scriptEmitter . Emit < int > ( context , useAssemblyName ? AssemblyName : "" ) ;
68
87
if ( ! emitResult . Success )
69
88
{
70
89
throw new CompilationErrorException ( "One or more errors occurred when emitting the assembly" , emitResult . Diagnostics ) ;
71
90
}
72
91
73
- var assemblyPath = Path . Combine ( tempProjectDirecory , $ "{ AssemblyName } .dll") ;
92
+ var assemblyPath = Path . Combine ( outputDirectory , $ "{ AssemblyName } .dll") ;
74
93
using ( var peFileStream = new FileStream ( assemblyPath , FileMode . Create ) )
75
94
using ( emitResult . PeStream )
76
95
{
77
96
emitResult . PeStream . WriteTo ( peFileStream ) ;
78
97
}
79
98
80
- var pdbPath = Path . Combine ( tempProjectDirecory , $ "{ AssemblyName } .pdb") ;
81
- using ( var pdbFileStream = new FileStream ( pdbPath , FileMode . Create ) )
82
- using ( emitResult . PdbStream )
99
+ if ( emitResult . PdbStream != null )
83
100
{
84
- emitResult . PdbStream . WriteTo ( pdbFileStream ) ;
101
+ var pdbPath = Path . Combine ( outputDirectory , $ "{ AssemblyName } .pdb") ;
102
+ using ( var pdbFileStream = new FileStream ( pdbPath , FileMode . Create ) )
103
+ using ( emitResult . PdbStream )
104
+ {
105
+ emitResult . PdbStream . WriteTo ( pdbFileStream ) ;
106
+ }
85
107
}
86
108
87
109
foreach ( var reference in emitResult . DirectiveReferences )
88
110
{
89
111
if ( reference . Display . EndsWith ( ".NuGet.dll" ) ) continue ;
90
112
var refInfo = new FileInfo ( reference . Display ) ;
91
- var newAssemblyPath = Path . Combine ( tempProjectDirecory , refInfo . Name ) ;
113
+ var newAssemblyPath = Path . Combine ( outputDirectory , refInfo . Name ) ;
92
114
File . Copy ( refInfo . FullName , newAssemblyPath , true ) ;
93
115
}
94
116
0 commit comments