Skip to content

Commit

Permalink
fixes dotnet#2274: adds possibility to add project to a solution dire…
Browse files Browse the repository at this point in the history
…ctory for "add projects to a solution" post action
  • Loading branch information
vlada-shubina committed Sep 24, 2020
1 parent 874f73f commit 507c365
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 16 deletions.
4 changes: 3 additions & 1 deletion docs/Post-Action-Registry.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ Opens a file in the editor. For command line cases this post action will be igno
- **Specific Configuration** :
- `args`:
- `primaryOutputIndexes` (string): A semicolon delimited list of indexes to the primary outputs. Note: If primary outputs are conditional, multiple post actions with the same conditions as the primary outputs might be necessary.
- `solutionFolder` (string) (optional) (supported in .NET 5.0.200 or later): the destination solution folder path to add the projects to.
- **Supported in**:
- `dotnet new3`
- `dotnet new` (2.0.0 or higher)
Expand All @@ -169,7 +170,8 @@ Opens a file in the editor. For command line cases this post action will be igno
"description": "Add projects to solution",
"manualInstructions": [ { "text": "Run post action 'Add projects to a solution file'" } ],
"args": {
"primaryOutputIndexes": "0;2"
"primaryOutputIndexes": "0;2",
"solutionFolder": "src"
},
"actionId": "D396686C-DE0E-4DE6-906D-291CD29FC5DE",
"continueOnError": true
Expand Down
19 changes: 18 additions & 1 deletion src/Microsoft.TemplateEngine.Cli/Dotnet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;

namespace Microsoft.TemplateEngine.Cli
{
Expand All @@ -15,6 +17,15 @@ public class Dotnet
private DataReceivedEventHandler _outputDataReceived;
private bool _anyNonEmptyStderrWritten;

public string Command
{
get
{
return string.Concat(_info.FileName, " ", _info.Arguments);
}
}


public static Dotnet Restore(params string[] args)
{
return new Dotnet
Expand Down Expand Up @@ -67,7 +78,7 @@ public static Dotnet AddPackageReference(string projectFile, string packageName,
};
}

public static Dotnet AddProjectsToSolution(string solutionFile, IReadOnlyList<string> projects)
public static Dotnet AddProjectsToSolution(string solutionFile, IReadOnlyList<string> projects, string solutionFolder = "")
{
List<string> allArgs = new List<string>()
{
Expand All @@ -76,6 +87,12 @@ public static Dotnet AddProjectsToSolution(string solutionFile, IReadOnlyList<st
"add"
};

if (!string.IsNullOrEmpty(solutionFolder))
{
allArgs.Add("--solution-folder");
allArgs.Add(solutionFolder);
}

allArgs.AddRange(projects);
string argString = ArgumentEscaper.EscapeAndConcatenateArgArrayForProcessStart(allArgs);

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 4 additions & 3 deletions src/Microsoft.TemplateEngine.Cli/LocalizableStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -536,18 +536,19 @@ Run 'dotnet {1} --show-aliases' with no args to show all aliases.</value>
<value>Unable to automatically add the framework reference {0} to the project. Manually edit the project file to add it.</value>
</data>
<data name="AddProjToSlnPostActionFailed" xml:space="preserve">
<value>Failed to add project(s) {0} to solution file {1}</value>
<value>Failed to add project(s) {0} to solution file {1}, solution folder {2}.</value>
</data>
<data name="AddProjToSlnPostActionNoProjFiles" xml:space="preserve">
<value>Add project reference to solution action is not configured correctly in the template. Unable to determine the project files to add.</value>
</data>
<data name="AddProjToSlnPostActionRunning" xml:space="preserve">
<value>Adding project reference(s) to solution file. Running dotnet sln {0} add {1}</value>
<value>Adding project reference(s) to solution file. Running {0}</value>
</data>
<data name="AddProjToSlnPostActionSucceeded" xml:space="preserve">
<value>Successfully added
project(s): {0}
to solution file: {1}</value>
to solution file: {1}
solution folder: {2}</value>
</data>
<data name="AddProjToSlnPostActionUnresolvedSlnFile" xml:space="preserve">
<value>Unable to determine which solution file to add the reference to.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,23 @@ public bool Process(IEngineEnvironmentSettings environment, IPostAction actionCo
return false;
}

Dotnet addProjToSlnCommand = Dotnet.AddProjectsToSolution(nearestSlnFilesFould[0], projectFiles);
string solutionFolder = GetSolutionFolder(actionConfig);
Dotnet addProjToSlnCommand = Dotnet.AddProjectsToSolution(nearestSlnFilesFould[0], projectFiles, GetSolutionFolder(actionConfig));
addProjToSlnCommand.CaptureStdOut();
addProjToSlnCommand.CaptureStdErr();
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionRunning, nearestSlnFilesFould[0], string.Join(" ", projectFiles)));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionRunning, addProjToSlnCommand.Command));
Dotnet.Result commandResult = addProjToSlnCommand.Execute();

if (commandResult.ExitCode != 0)
{
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionFailed, string.Join(" ", projectFiles), nearestSlnFilesFould[0]));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionFailed, string.Join(" ", projectFiles), nearestSlnFilesFould[0], solutionFolder));
environment.Host.LogMessage(string.Format(LocalizableStrings.CommandOutput, commandResult.StdOut + Environment.NewLine + Environment.NewLine + commandResult.StdErr));
environment.Host.LogMessage(string.Empty);
return false;
}
else
{
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionSucceeded, string.Join(" ", projectFiles), nearestSlnFilesFould[0]));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionSucceeded, string.Join(" ", projectFiles), nearestSlnFilesFould[0], solutionFolder));
return true;
}
}
Expand Down Expand Up @@ -168,25 +169,35 @@ public bool Process(IEngineEnvironmentSettings environment, IPostAction action,
return Process(environment, action, templateCreationResult, outputBasePath);
}

Dotnet addProjToSlnCommand = Dotnet.AddProjectsToSolution(nearestSlnFilesFould[0], projectFiles);
string solutionFolder = GetSolutionFolder(action);
Dotnet addProjToSlnCommand = Dotnet.AddProjectsToSolution(nearestSlnFilesFould[0], projectFiles, solutionFolder);
addProjToSlnCommand.CaptureStdOut();
addProjToSlnCommand.CaptureStdErr();
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionRunning, nearestSlnFilesFould[0], string.Join(" ", projectFiles)));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionRunning, addProjToSlnCommand.Command));
Dotnet.Result commandResult = addProjToSlnCommand.Execute();

if (commandResult.ExitCode != 0)
{
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionFailed, string.Join(" ", projectFiles), nearestSlnFilesFould[0]));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionFailed, string.Join(" ", projectFiles), nearestSlnFilesFould[0], solutionFolder));
environment.Host.LogMessage(string.Format(LocalizableStrings.CommandOutput, commandResult.StdOut + Environment.NewLine + Environment.NewLine + commandResult.StdErr));
environment.Host.LogMessage(string.Empty);
return false;
}
else
{
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionSucceeded, string.Join(" ", projectFiles), nearestSlnFilesFould[0]));
environment.Host.LogMessage(string.Format(LocalizableStrings.AddProjToSlnPostActionSucceeded, string.Join(" ", projectFiles), nearestSlnFilesFould[0], solutionFolder));
return true;
}

}

private string GetSolutionFolder(IPostAction actionConfig)
{
if ((actionConfig.Args != null) && actionConfig.Args.TryGetValue("solutionFolder", out string solutionFolder))
{
return solutionFolder;
}
return string.Empty;
}
}
}

0 comments on commit 507c365

Please sign in to comment.