Execute self-contained .NET binary (#5519)

* Execute self-contained .NET binary
* Skip dotnet lookup for self-contained binaries
This commit is contained in:
Mikhail Shilkov 2020-10-07 11:46:24 +02:00 committed by GitHub
parent 2b67c6ea81
commit 879066a60b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 7 deletions

View file

@ -15,6 +15,9 @@ CHANGELOG
- Add internal scaffolding for using cross-language components from .NET.
[#5485](https://github.com/pulumi/pulumi/pull/5485)
- Support self-contained executables as binary option for .NET programs.
[#5519](https://github.com/pulumi/pulumi/pull/5519)
## 2.11.2 (2020-10-01)
- feat(autoapi): expose EnvVars LocalWorkspaceOption to set in ctor

View file

@ -61,7 +61,13 @@ func main() {
logging.InitLogging(false, 0, false)
cmdutil.InitTracing("pulumi-language-dotnet", "pulumi-language-dotnet", tracing)
var dotnetExec string
if givenExecutor == "" {
switch {
case givenExecutor != "":
logging.V(3).Infof("language host asked to use specific executor: `%s`", givenExecutor)
dotnetExec = givenExecutor
case binary != "" && !strings.HasSuffix(binary, ".dll"):
logging.V(3).Info("language host requires no .NET SDK for a self-contained binary")
default:
pathExec, err := exec.LookPath("dotnet")
if err != nil {
err = errors.Wrap(err, "could not find `dotnet` on the $PATH")
@ -70,9 +76,6 @@ func main() {
logging.V(3).Infof("language host identified executor from path: `%s`", pathExec)
dotnetExec = pathExec
} else {
logging.V(3).Infof("language host asked to use specific executor: `%s`", givenExecutor)
dotnetExec = givenExecutor
}
// Optionally pluck out the engine so we can do logging, etc.
@ -477,11 +480,18 @@ func (host *dotnetLanguageHost) Run(ctx context.Context, req *pulumirpc.RunReque
return nil, err
}
executable := host.exec
args := []string{}
if host.binary != "" {
switch {
case host.binary != "" && strings.HasSuffix(host.binary, ".dll"):
// Portable pre-compiled dll: run `dotnet <name>.dll`
args = append(args, host.binary)
} else {
case host.binary != "":
// Self-contained executable: run it directly.
executable = host.binary
default:
// Run from source.
args = append(args, "run")
if req.GetProgram() != "" {
@ -496,7 +506,7 @@ func (host *dotnetLanguageHost) Run(ctx context.Context, req *pulumirpc.RunReque
// Now simply spawn a process to execute the requested program, wiring up stdout/stderr directly.
var errResult string
cmd := exec.Command(host.exec, args...) // nolint: gas // intentionally running dynamic program name.
cmd := exec.Command(executable, args...) // nolint: gas // intentionally running dynamic program name.
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = host.constructEnv(req, config)