Adding support for output file name for apps.
This commit is contained in:
parent
856fb8d6d9
commit
03f5379165
9 changed files with 88 additions and 34 deletions
10
TestAssets/TestProjects/AppWithOutputAssemblyName/Program.cs
Normal file
10
TestAssets/TestProjects/AppWithOutputAssemblyName/Program.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
namespace AppWithOutputAssemblyName
|
||||||
|
{
|
||||||
|
public class MyApp
|
||||||
|
{
|
||||||
|
public static void Main()
|
||||||
|
{
|
||||||
|
System.Console.WriteLine("Hello, World!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"compilationOptions": {
|
||||||
|
"outputName": "MyApp",
|
||||||
|
"emitEntryPoint": true,
|
||||||
|
"preserveCompilationContext": true
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"NETStandard.Library": "1.0.0-rc2-23901"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandardapp1.5": {
|
||||||
|
"imports": "dnxcore50"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,8 @@
|
||||||
{
|
{
|
||||||
"version": "1.0.0-*",
|
"version": "1.0.0-*",
|
||||||
"compilationOptions": {
|
"compilationOptions": {
|
||||||
"emitEntryPoint": true
|
"emitEntryPoint": true,
|
||||||
|
"outputName": "AppWithContentPackage"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"NETStandard.Library": "1.5.0-rc2-23911",
|
"NETStandard.Library": "1.5.0-rc2-23911",
|
||||||
|
|
|
@ -28,14 +28,14 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
|
|
||||||
private readonly LibraryExporter _exporter;
|
private readonly LibraryExporter _exporter;
|
||||||
|
|
||||||
private readonly string _configuration;
|
|
||||||
|
|
||||||
private readonly OutputPaths _outputPaths;
|
private readonly OutputPaths _outputPaths;
|
||||||
|
|
||||||
private readonly string _runtimeOutputPath;
|
private readonly string _runtimeOutputPath;
|
||||||
|
|
||||||
private readonly string _intermediateOutputPath;
|
private readonly string _intermediateOutputPath;
|
||||||
|
|
||||||
|
private readonly CommonCompilerOptions _compilerOptions;
|
||||||
|
|
||||||
public Executable(ProjectContext context, OutputPaths outputPaths, LibraryExporter exporter, string configuration)
|
public Executable(ProjectContext context, OutputPaths outputPaths, LibraryExporter exporter, string configuration)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
|
@ -43,7 +43,7 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
_runtimeOutputPath = outputPaths.RuntimeOutputPath;
|
_runtimeOutputPath = outputPaths.RuntimeOutputPath;
|
||||||
_intermediateOutputPath = outputPaths.IntermediateOutputDirectoryPath;
|
_intermediateOutputPath = outputPaths.IntermediateOutputDirectoryPath;
|
||||||
_exporter = exporter;
|
_exporter = exporter;
|
||||||
_configuration = configuration;
|
_compilerOptions = _context.ProjectFile.GetCompilerOptions(_context.TargetFramework, configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MakeCompilationOutputRunnable()
|
public void MakeCompilationOutputRunnable()
|
||||||
|
@ -76,11 +76,11 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
{
|
{
|
||||||
WriteDepsFileAndCopyProjectDependencies(_exporter);
|
WriteDepsFileAndCopyProjectDependencies(_exporter);
|
||||||
|
|
||||||
var emitEntryPoint = _context.ProjectFile.GetCompilerOptions(_context.TargetFramework, _configuration).EmitEntryPoint ?? false;
|
var emitEntryPoint = _compilerOptions.EmitEntryPoint ?? false;
|
||||||
if (emitEntryPoint && !string.IsNullOrEmpty(_context.RuntimeIdentifier))
|
if (emitEntryPoint && !string.IsNullOrEmpty(_context.RuntimeIdentifier))
|
||||||
{
|
{
|
||||||
// TODO: Pick a host based on the RID
|
// TODO: Pick a host based on the RID
|
||||||
CoreHost.CopyTo(_runtimeOutputPath, _context.ProjectFile.Name + Constants.ExeSuffix);
|
CoreHost.CopyTo(_runtimeOutputPath, GetOutputName() + Constants.ExeSuffix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +144,9 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
runtimeOptions.Add("framework", framework);
|
runtimeOptions.Add("framework", framework);
|
||||||
}
|
}
|
||||||
|
|
||||||
var runtimeConfigJsonFile = Path.Combine(_runtimeOutputPath, _context.ProjectFile.Name + FileNameSuffixes.RuntimeConfigJson);
|
var runtimeConfigJsonFile =
|
||||||
|
Path.Combine(_runtimeOutputPath, GetOutputName() + FileNameSuffixes.RuntimeConfigJson);
|
||||||
|
|
||||||
using (var writer = new JsonTextWriter(new StreamWriter(File.Create(runtimeConfigJsonFile))))
|
using (var writer = new JsonTextWriter(new StreamWriter(File.Create(runtimeConfigJsonFile))))
|
||||||
{
|
{
|
||||||
writer.Formatting = Formatting.Indented;
|
writer.Formatting = Formatting.Indented;
|
||||||
|
@ -155,18 +157,18 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
|
|
||||||
public void WriteDeps(LibraryExporter exporter)
|
public void WriteDeps(LibraryExporter exporter)
|
||||||
{
|
{
|
||||||
var path = Path.Combine(_runtimeOutputPath, _context.ProjectFile.Name + FileNameSuffixes.Deps);
|
Directory.CreateDirectory(_runtimeOutputPath);
|
||||||
CreateDirectoryIfNotExists(path);
|
|
||||||
File.WriteAllLines(path, exporter
|
var depsFilePath = Path.Combine(_runtimeOutputPath, GetOutputName() + FileNameSuffixes.Deps);
|
||||||
|
File.WriteAllLines(depsFilePath, exporter
|
||||||
.GetDependencies(LibraryType.Package)
|
.GetDependencies(LibraryType.Package)
|
||||||
.SelectMany(GenerateLines));
|
.SelectMany(GenerateLines));
|
||||||
|
|
||||||
var compilerOptions = _context.ResolveCompilationOptions(_configuration);
|
var includeCompile = _compilerOptions.PreserveCompilationContext == true;
|
||||||
var includeCompile = compilerOptions.PreserveCompilationContext == true;
|
|
||||||
|
|
||||||
var exports = exporter.GetAllExports().ToArray();
|
var exports = exporter.GetAllExports().ToArray();
|
||||||
var dependencyContext = new DependencyContextBuilder().Build(
|
var dependencyContext = new DependencyContextBuilder().Build(
|
||||||
compilerOptions: includeCompile ? compilerOptions : null,
|
compilerOptions: includeCompile ? _compilerOptions : null,
|
||||||
compilationExports: includeCompile ? exports : null,
|
compilationExports: includeCompile ? exports : null,
|
||||||
runtimeExports: exports,
|
runtimeExports: exports,
|
||||||
portable: string.IsNullOrEmpty(_context.RuntimeIdentifier),
|
portable: string.IsNullOrEmpty(_context.RuntimeIdentifier),
|
||||||
|
@ -174,8 +176,8 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
runtime: _context.RuntimeIdentifier ?? string.Empty);
|
runtime: _context.RuntimeIdentifier ?? string.Empty);
|
||||||
|
|
||||||
var writer = new DependencyContextWriter();
|
var writer = new DependencyContextWriter();
|
||||||
var depsJsonFile = Path.Combine(_runtimeOutputPath, _context.ProjectFile.Name + FileNameSuffixes.DepsJson);
|
var depsJsonFilePath = Path.Combine(_runtimeOutputPath, GetOutputName() + FileNameSuffixes.DepsJson);
|
||||||
using (var fileStream = File.Create(depsJsonFile))
|
using (var fileStream = File.Create(depsJsonFilePath))
|
||||||
{
|
{
|
||||||
writer.Write(dependencyContext, fileStream);
|
writer.Write(dependencyContext, fileStream);
|
||||||
}
|
}
|
||||||
|
@ -210,11 +212,9 @@ namespace Microsoft.Dotnet.Cli.Compiler.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetOutputName()
|
||||||
private static void CreateDirectoryIfNotExists(string path)
|
|
||||||
{
|
{
|
||||||
var depsFile = new FileInfo(path);
|
return _compilerOptions.OutputName ?? _context.ProjectFile.Name;
|
||||||
depsFile.Directory.Create();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<string> GenerateLines(LibraryExport export)
|
private static IEnumerable<string> GenerateLines(LibraryExport export)
|
||||||
|
|
|
@ -37,8 +37,12 @@ namespace Microsoft.DotNet.ProjectModel
|
||||||
// The executable is a DLL in this case
|
// The executable is a DLL in this case
|
||||||
extension = FileNameSuffixes.DotNet.DynamicLib;
|
extension = FileNameSuffixes.DotNet.DynamicLib;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var compilationOptions = Project.GetCompilerOptions(Framework, Configuration);
|
||||||
|
|
||||||
return Path.Combine(BasePath, Project.Name + extension);
|
return Path.Combine(
|
||||||
|
BasePath,
|
||||||
|
(compilationOptions.OutputName ?? Project.Name) + extension);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -438,7 +438,6 @@ namespace Microsoft.DotNet.Tools.Build
|
||||||
|
|
||||||
CopyCompilationOutput(outputPaths);
|
CopyCompilationOutput(outputPaths);
|
||||||
|
|
||||||
var options = runtimeContext.ProjectFile.GetCompilerOptions(runtimeContext.TargetFramework, _args.ConfigValue);
|
|
||||||
var executable = new Executable(runtimeContext, outputPaths, libraryExporter, _args.ConfigValue);
|
var executable = new Executable(runtimeContext, outputPaths, libraryExporter, _args.ConfigValue);
|
||||||
executable.MakeCompilationOutputRunnable();
|
executable.MakeCompilationOutputRunnable();
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,8 @@ namespace Microsoft.DotNet.Tools.Compiler
|
||||||
foreach (var resourceFile in dependency.EmbeddedResources)
|
foreach (var resourceFile in dependency.EmbeddedResources)
|
||||||
{
|
{
|
||||||
var transformedResource = resourceFile.GetTransformedFile(intermediateOutputPath);
|
var transformedResource = resourceFile.GetTransformedFile(intermediateOutputPath);
|
||||||
var resourceName = ResourceManifestName.CreateManifestName(Path.GetFileName(resourceFile.ResolvedPath), context.ProjectFile.Name);
|
var resourceName = ResourceManifestName.CreateManifestName(
|
||||||
|
Path.GetFileName(resourceFile.ResolvedPath), compilationOptions.OutputName ?? context.ProjectFile.Name);
|
||||||
compilerArgs.Add($"--resource:\"{transformedResource}\",{resourceName}");
|
compilerArgs.Add($"--resource:\"{transformedResource}\",{resourceName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,13 +120,14 @@ namespace Microsoft.DotNet.Tools.Compiler
|
||||||
context.RuntimeIdentifier ?? string.Empty);
|
context.RuntimeIdentifier ?? string.Empty);
|
||||||
|
|
||||||
var writer = new DependencyContextWriter();
|
var writer = new DependencyContextWriter();
|
||||||
var depsJsonFile = Path.Combine(intermediateOutputPath, context.ProjectFile.Name + "dotnet-compile.deps.json");
|
var depsJsonFile = Path.Combine(intermediateOutputPath,
|
||||||
|
(compilationOptions.OutputName ?? context.ProjectFile.Name) + "dotnet-compile.deps.json");
|
||||||
using (var fileStream = File.Create(depsJsonFile))
|
using (var fileStream = File.Create(depsJsonFile))
|
||||||
{
|
{
|
||||||
writer.Write(dependencyContext, fileStream);
|
writer.Write(dependencyContext, fileStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
compilerArgs.Add($"--resource:\"{depsJsonFile}\",{context.ProjectFile.Name}.deps.json");
|
compilerArgs.Add($"--resource:\"{depsJsonFile}\",{compilationOptions.OutputName ?? context.ProjectFile.Name}.deps.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AddNonCultureResources(context.ProjectFile, compilerArgs, intermediateOutputPath))
|
if (!AddNonCultureResources(context.ProjectFile, compilerArgs, intermediateOutputPath))
|
||||||
|
|
|
@ -261,9 +261,12 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
|
||||||
|
|
||||||
public string GetOutputExecutableName()
|
public string GetOutputExecutableName()
|
||||||
{
|
{
|
||||||
var result = _project.Name;
|
return _project.Name + GetExecutableExtension();
|
||||||
result += RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "";
|
}
|
||||||
return result;
|
|
||||||
|
public string GetExecutableExtension()
|
||||||
|
{
|
||||||
|
return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
private string BuildArgs()
|
private string BuildArgs()
|
||||||
|
|
|
@ -124,7 +124,7 @@ namespace Microsoft.DotNet.Tools.Compiler.Tests
|
||||||
var result = buildCommand.ExecuteWithCapturedOutput();
|
var result = buildCommand.ExecuteWithCapturedOutput();
|
||||||
result.Should().Pass();
|
result.Should().Pass();
|
||||||
|
|
||||||
result = Command.Create(Path.Combine(outputDir, buildCommand.GetOutputExecutableName()), new string [0])
|
result = Command.Create(Path.Combine(outputDir, "AppWithContentPackage" + buildCommand.GetExecutableExtension()), new string [0])
|
||||||
.CaptureStdErr()
|
.CaptureStdErr()
|
||||||
.CaptureStdOut()
|
.CaptureStdOut()
|
||||||
.Execute();
|
.Execute();
|
||||||
|
@ -137,13 +137,13 @@ namespace Microsoft.DotNet.Tools.Compiler.Tests
|
||||||
new DirectoryInfo(outputDir).Should()
|
new DirectoryInfo(outputDir).Should()
|
||||||
.HaveFile("config.xml");
|
.HaveFile("config.xml");
|
||||||
// verify embedded resources
|
// verify embedded resources
|
||||||
result.StdOut.Should().Contain("TestAppWithContentPackage.dnf.png");
|
result.StdOut.Should().Contain("AppWithContentPackage.dnf.png");
|
||||||
result.StdOut.Should().Contain("TestAppWithContentPackage.ui.png");
|
result.StdOut.Should().Contain("AppWithContentPackage.ui.png");
|
||||||
// verify 'all' language files not included
|
// verify 'all' language files not included
|
||||||
result.StdOut.Should().NotContain("TestAppWithContentPackage.dnf_all.png");
|
result.StdOut.Should().NotContain("AppWithContentPackage.dnf_all.png");
|
||||||
result.StdOut.Should().NotContain("TestAppWithContentPackage.ui_all.png");
|
result.StdOut.Should().NotContain("AppWithContentPackage.ui_all.png");
|
||||||
// verify classes
|
// verify classes
|
||||||
result.StdOut.Should().Contain("TestAppWithContentPackage.Foo");
|
result.StdOut.Should().Contain("AppWithContentPackage.Foo");
|
||||||
result.StdOut.Should().Contain("MyNamespace.Util");
|
result.StdOut.Should().Contain("MyNamespace.Util");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +168,7 @@ namespace Microsoft.DotNet.Tools.Compiler.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void CanSetOutputAssemblyName()
|
public void CanSetOutputAssemblyNameForLibraries()
|
||||||
{
|
{
|
||||||
var testInstance =
|
var testInstance =
|
||||||
TestAssetsManager
|
TestAssetsManager
|
||||||
|
@ -185,6 +185,26 @@ namespace Microsoft.DotNet.Tools.Compiler.Tests
|
||||||
new DirectoryInfo(outputDir).Should().HaveFiles(new [] { "MyLibrary.dll" });
|
new DirectoryInfo(outputDir).Should().HaveFiles(new [] { "MyLibrary.dll" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanSetOutputAssemblyNameForApps()
|
||||||
|
{
|
||||||
|
var testInstance =
|
||||||
|
TestAssetsManager
|
||||||
|
.CreateTestInstance("AppWithOutputAssemblyName")
|
||||||
|
.WithLockFiles();
|
||||||
|
|
||||||
|
var root = testInstance.TestRoot;
|
||||||
|
var outputDir = Path.Combine(root, "bin");
|
||||||
|
var testProject = ProjectUtils.GetProjectJson(root, "AppWithOutputAssemblyName");
|
||||||
|
var buildCommand = new BuildCommand(testProject, output: outputDir, framework: DefaultFramework);
|
||||||
|
var result = buildCommand.ExecuteWithCapturedOutput();
|
||||||
|
result.Should().Pass();
|
||||||
|
|
||||||
|
new DirectoryInfo(outputDir).Should().HaveFiles(
|
||||||
|
new [] { "MyApp.dll", "MyApp" + buildCommand.GetExecutableExtension(),
|
||||||
|
"MyApp.runtimeconfig.json", "MyApp.deps", "MyApp.deps.json" });
|
||||||
|
}
|
||||||
|
|
||||||
private void CopyProjectToTempDir(string projectDir, TempDirectory tempDir)
|
private void CopyProjectToTempDir(string projectDir, TempDirectory tempDir)
|
||||||
{
|
{
|
||||||
// copy all the files to temp dir
|
// copy all the files to temp dir
|
||||||
|
|
Loading…
Reference in a new issue