anchor.diff:      var scriptArg = script == null ? package : '$package:$script';
       List args = ['run', scriptArg];
       if (arguments != null) args.addAll(arguments);
  -    return run_lib.run(_sdkBin('pub'), arguments: args,
  -    runOptions: runOptions);
  +    return run_lib.run(_sdkBin('pub'), arguments: args, runOptions: runOptions);
  +  }
  +
  +  /// Run `pub run` on the given [package] and [script].
  +  ///
  +  /// If [script] is null it defaults to the same value as [package].
  +  static Future<String> runAsync(String package,
  +      {List<String> arguments, RunOptions runOptions, String script}) {
  +    var scriptArg = script == null ? package : '$package:$script';
  +    List args = ['run', scriptArg];
  +    if (arguments != null) args.addAll(arguments);
  +    return run_lib.runAsync(_sdkBin('pub'), arguments: args,
  +        runOptions: runOptions);
     }
   
     static String version({bool quiet: false}) => _AppVersion.parse(
  
positive.code:         arguments: arguments,
          runOptions: runOptions);
    }
  }
  
  class _PubLocalApp extends PubApp {
  
negative.code:   String run(List<String> arguments, {String script, RunOptions runOptions,
        @Deprecated('Use RunOptions.workingDirectory instead.')
        String workingDirectory});
  
    /// Run the application. If the application is not installed this command will
    /// first activate it.
    ///
    /// If [script] is provided, the sub-script will be run. So
    /// `new PubApp.global('grinder').runAsync(script: 'init');` will run
    /// `grinder:init`.
    Future<String> runAsync(List<String> arguments, {String script,
      RunOptions runOptions});
  
    String toString() => packageName;
  }
  