anchor.diff:  let getAllParameters targets maxcpu nodeReuse tools verbosity fileLoggers properties = 
       if isUnix then [ targets; tools; verbosity ] @ fileLoggers @ properties
       else [ targets; maxcpu; nodeReuse; tools; verbosity ] @ fileLoggers @ properties
  +
  +let private serializeArgs args =
  +    args
  +    |> Seq.map (function 
  +           | None -> ""
  +           | Some(k, v) -> 
  +               "/" + k + (if isNullOrEmpty v then ""
  +                          else ":" + v))
  +    |> separated " "
   
   /// [omit]
   let serializeMSBuildParams (p : MSBuildParams) = 
  
positive.code: /// [omit]
  let ErrorLoggerName = typedefof<Fake.MsBuildLogger.ErrorLogger>.FullName
  
  let private errorLoggerParam = 
      let pathToLogger = typedefof<MSBuildParams>.Assembly.Location
      [ TeamCityLoggerName; ErrorLoggerName ]
      |> List.map (fun a -> sprintf "/logger:%s,\"%s\"" a pathToLogger)
      |> fun lst -> String.Join(" ", lst)
  
  /// Runs a MSBuild project
  /// ## Parameters
  ///  - `setParams` - A function that overwrites the default MsBuildParams
  
negative.code:         MSBuildDefaults
          |> setParams
          |> serializeMSBuildParams
  
      let errorLoggerParam = 
          MSBuildLoggers
          |> List.map (fun a -> Some ("logger", a))
          |> serializeArgs
      
      let args = toParam project + " " + args + " " + errorLoggerParam
      tracefn "Building project: %s\n  %s %s" project msBuildExe args
  