Publish can skip Build

This commit is contained in:
Mihai Codoban 2016-03-29 14:15:26 -07:00
parent 090336d785
commit ded82caccd
4 changed files with 68 additions and 30 deletions

View file

@ -28,6 +28,7 @@ namespace Microsoft.DotNet.Tools.Publish
var configuration = app.Option("-c|--configuration <CONFIGURATION>", "Configuration under which to build", CommandOptionType.SingleValue); var configuration = app.Option("-c|--configuration <CONFIGURATION>", "Configuration under which to build", CommandOptionType.SingleValue);
var projectPath = app.Argument("<PROJECT>", "The project to publish, defaults to the current directory. Can be a path to a project.json or a project directory"); var projectPath = app.Argument("<PROJECT>", "The project to publish, defaults to the current directory. Can be a path to a project.json or a project directory");
var nativeSubdirectories = app.Option("--native-subdirectory", "Temporary mechanism to include subdirectories from native assets of dependency packages in output", CommandOptionType.NoValue); var nativeSubdirectories = app.Option("--native-subdirectory", "Temporary mechanism to include subdirectories from native assets of dependency packages in output", CommandOptionType.NoValue);
var noBuild = app.Option("--no-build", "Do not build projects before publishing", CommandOptionType.NoValue);
app.OnExecute(() => app.OnExecute(() =>
{ {
@ -41,6 +42,7 @@ namespace Microsoft.DotNet.Tools.Publish
publish.NativeSubdirectories = nativeSubdirectories.HasValue(); publish.NativeSubdirectories = nativeSubdirectories.HasValue();
publish.ProjectPath = projectPath.Value; publish.ProjectPath = projectPath.Value;
publish.VersionSuffix = versionSuffix.Value(); publish.VersionSuffix = versionSuffix.Value();
publish.ShouldBuild = !noBuild.HasValue();
if (string.IsNullOrEmpty(publish.ProjectPath)) if (string.IsNullOrEmpty(publish.ProjectPath))
{ {

View file

@ -35,6 +35,7 @@ namespace Microsoft.DotNet.Tools.Publish
public string VersionSuffix { get; set; } public string VersionSuffix { get; set; }
public int NumberOfProjects { get; private set; } public int NumberOfProjects { get; private set; }
public int NumberOfPublishedProjects { get; private set; } public int NumberOfPublishedProjects { get; private set; }
public bool ShouldBuild { get; set; }
public bool TryPrepareForPublish() public bool TryPrepareForPublish()
{ {
@ -119,34 +120,7 @@ namespace Microsoft.DotNet.Tools.Publish
} }
// Compile the project (and transitively, all it's dependencies) // Compile the project (and transitively, all it's dependencies)
var args = new List<string>() { if (ShouldBuild && !InvokeBuildOnProject(context, buildBasePath, configuration))
"--framework",
$"{context.TargetFramework.DotNetFrameworkName}",
"--configuration",
configuration,
context.ProjectFile.ProjectDirectory
};
if (!string.IsNullOrEmpty(context.RuntimeIdentifier))
{
args.Insert(0, context.RuntimeIdentifier);
args.Insert(0, "--runtime");
}
if (!string.IsNullOrEmpty(VersionSuffix))
{
args.Add("--version-suffix");
args.Add(VersionSuffix);
}
if (!string.IsNullOrEmpty(buildBasePath))
{
args.Add("--build-base-path");
args.Add(buildBasePath);
}
var result = Build.BuildCommand.Run(args.ToArray());
if (result != 0)
{ {
return false; return false;
} }
@ -206,6 +180,40 @@ namespace Microsoft.DotNet.Tools.Publish
return true; return true;
} }
private Boolean InvokeBuildOnProject(ProjectContext context, String buildBasePath, String configuration)
{
var args = new List<string>()
{
"--framework",
$"{context.TargetFramework.DotNetFrameworkName}",
"--configuration",
configuration,
context.ProjectFile.ProjectDirectory
};
if (!string.IsNullOrEmpty(context.RuntimeIdentifier))
{
args.Insert(0, context.RuntimeIdentifier);
args.Insert(0, "--runtime");
}
if (!string.IsNullOrEmpty(VersionSuffix))
{
args.Add("--version-suffix");
args.Add(VersionSuffix);
}
if (!string.IsNullOrEmpty(buildBasePath))
{
args.Add("--build-base-path");
args.Add(buildBasePath);
}
var result = Build.BuildCommand.Run(args.ToArray());
return result == 0;
}
private HashSet<string> GetExclusionList(ProjectContext context, Dictionary<string, LibraryExport> exports) private HashSet<string> GetExclusionList(ProjectContext context, Dictionary<string, LibraryExport> exports)
{ {
var exclusionList = new HashSet<string>(); var exclusionList = new HashSet<string>();

View file

@ -19,9 +19,10 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
private readonly string _framework; private readonly string _framework;
private readonly string _runtime; private readonly string _runtime;
private readonly string _config; private readonly string _config;
private readonly bool _noBuild;
private readonly string _output; private readonly string _output;
public PublishCommand(string projectPath, string framework = "", string runtime = "", string output = "", string config = "", bool forcePortable = false) public PublishCommand(string projectPath, string framework = "", string runtime = "", string output = "", string config = "", bool forcePortable = false, bool noBuild = false)
: base("dotnet") : base("dotnet")
{ {
_path = projectPath; _path = projectPath;
@ -30,6 +31,7 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
_runtime = runtime; _runtime = runtime;
_output = output; _output = output;
_config = config; _config = config;
_noBuild = noBuild;
} }
public override CommandResult Execute(string args = "") public override CommandResult Execute(string args = "")
@ -91,12 +93,13 @@ namespace Microsoft.DotNet.Tools.Test.Utilities
private string BuildArgs() private string BuildArgs()
{ {
return $"{_path} {FrameworkOption} {RuntimeOption} {OutputOption} {ConfigOption}"; return $"{_path} {FrameworkOption} {RuntimeOption} {OutputOption} {ConfigOption} {NoBuildFlag}";
} }
private string FrameworkOption => string.IsNullOrEmpty(_framework) ? "" : $"-f {_framework}"; private string FrameworkOption => string.IsNullOrEmpty(_framework) ? "" : $"-f {_framework}";
private string RuntimeOption => string.IsNullOrEmpty(_runtime) ? "" : $"-r {_runtime}"; private string RuntimeOption => string.IsNullOrEmpty(_runtime) ? "" : $"-r {_runtime}";
private string OutputOption => string.IsNullOrEmpty(_output) ? "" : $"-o \"{_output}\""; private string OutputOption => string.IsNullOrEmpty(_output) ? "" : $"-o \"{_output}\"";
private string ConfigOption => string.IsNullOrEmpty(_config) ? "" : $"-c {_output}"; private string ConfigOption => string.IsNullOrEmpty(_config) ? "" : $"-c {_output}";
private string NoBuildFlag => _noBuild ? "--no-build" :"";
} }
} }

View file

@ -176,6 +176,31 @@ namespace Microsoft.DotNet.Tools.Publish.Tests
publishCommand.Execute().Should().Fail(); publishCommand.Execute().Should().Fail();
} }
[Fact]
public void PublishFailsWhenProjectNotBuiltAndNoBuildFlagSet()
{
TestInstance instance = TestAssetsManager.CreateTestInstance("TestAppCompilationContext")
.WithLockFiles();
var testProject = _getProjectJson(instance.TestRoot, "TestApp");
var publishCommand = new PublishCommand(testProject, noBuild: true);
publishCommand.Execute().Should().Fail();
}
[Fact]
public void PublishSucceedsWhenProjectPreviouslyCompiledAndNoBuildFlagSet()
{
TestInstance instance = TestAssetsManager.CreateTestInstance("TestAppCompilationContext")
.WithLockFiles()
.WithBuildArtifacts();
var testProject = _getProjectJson(instance.TestRoot, "TestApp");
var publishCommand = new PublishCommand(testProject, noBuild: true);
publishCommand.Execute().Should().Pass();
}
[Fact] [Fact]
public void PublishScriptsRun() public void PublishScriptsRun()
{ {