--- /dev/null
+diff --git a/morph.go b/morph.go
+index a88414b..e5894df 100644
+--- a/morph.go
++++ b/morph.go
+@@ -542,6 +542,7 @@ func getNixContext() *nix.NixContext {
+ return &nix.NixContext{
+ EvalMachines: filepath.Join(assetRoot, assets.Friendly, "eval-machines.nix"),
+ ShowTrace: showTrace,
++ DryRun: *dryRun,
+ KeepGCRoot: *keepGCRoot,
+ AllowBuildShell: *allowBuildShell,
+ }
+@@ -574,8 +575,10 @@ func buildHosts(hosts []nix.Host) (resultPath string, err error) {
+ return
+ }
+
+- fmt.Fprintln(os.Stderr, "nix result path: ")
+- fmt.Println(resultPath)
++ if resultPath != "" {
++ fmt.Fprintln(os.Stderr, "nix result path: ")
++ fmt.Println(resultPath)
++ }
+ return
+ }
+
+diff --git a/nix/nix.go b/nix/nix.go
+index 6a9cfd5..0f7884b 100644
+--- a/nix/nix.go
++++ b/nix/nix.go
+@@ -49,6 +49,7 @@ type Deployment struct {
+ type NixContext struct {
+ EvalMachines string
+ ShowTrace bool
++ DryRun bool
+ KeepGCRoot bool
+ AllowBuildShell bool
+ }
+@@ -269,6 +270,10 @@ func (ctx *NixContext) BuildMachines(deploymentPath string, hosts []Host, nixArg
+ args = append(args, "--show-trace")
+ }
+
++ if ctx.DryRun {
++ args = append(args, "--dry-run")
++ }
++
+ if nixBuildTargets != "" {
+ args = append(args,
+ "--arg", "buildTargets", nixBuildTargets)
+@@ -308,6 +313,10 @@ func (ctx *NixContext) BuildMachines(deploymentPath string, hosts []Host, nixArg
+ return resultPath, errors.New(errorMessage)
+ }
+
++ if ctx.DryRun {
++ return "", err
++ }
++
+ resultPath, err = os.Readlink(resultLinkPath)
+ if err != nil {
+ return "", err