Как запустить MSBuild из Powershell, не порождая процесс msbuild.exe?

Попробуйте параметризовать классы дел:

  type ![S] = S => Nothing
  type !![S] = ![![S]]
  type ∨[T, U] = ![![T] with ![U]]
  type |∨|[T, U] = {type λ[X] = !![X] <:< (T ∨ U)}

  abstract class State
  case class A() extends State
  case class B() extends State
  case class N() extends State

  case class C[S <: State](state: S)(implicit ev: (A |∨| B)#λ[S])

  val a = A()
  val b = B()
  val n = N()

  val ca = C(a)
  val cb = C(b)
  // val cn = C(n) // doesn't compile

Кодирование для большего количества классов

  type ![S] = S => Nothing
  type !![S] = ![![S]]

  trait Disj[T] {
    type or[S] = Disj[T with ![S]]
    type apply = ![T]
  }

  // for convenience
  type disj[T] = { type or[S] = Disj[![T]]#or[S] }

  type w[T, U, V] = disj[T]#or[U]#or[V]#apply
  type ww[T, U, V] = {type λ[X] = !![X] <:< w[T, U, V]}

  abstract class State
  case class A() extends State
  case class B() extends State
  case class C() extends State
  case class N() extends State

  case class D[S <: State](state: S)(implicit ev: ww[A, B, C]#λ[S])

  val a = A()
  val b = B()
  val c = C()
  val n = N()

  val da = D(a)
  val db = D(b)
  val dc = D(c)
//  val dn = D(n) // doesn't compile

Или вы можете использовать метод apply

[112 ]


Если вы хотите избежать сопутствующих объектов с помощью метода apply (по некоторым причинам), вы можете рассмотреть вторичные конструкторы

  type ![S] = S => Nothing
  type !![S] = ![![S]]
  type ∨[T, U] = ![![T] with ![U]]
  type |∨|[T, U] = {type λ[X] = !![X] <:< (T ∨ U)}

  abstract class State
  case class A() extends State
  case class B() extends State
  case class N() extends State

  // "ignored" is to avoid constructor ambiguity
  class C private(state: State, ignored: Int) {
    def this(state: State)(implicit ev: (A |∨| B)#λ[state.type]) = this(state, 0)
  }

  val a = A()
  val b = B()
  val n = N()

  val ca = new C(a)
  val cb = new C(b)
//  val cn = new C(n) // doesn't compile

Используя вторичный конструктор или объект сопутствующего объекта apply Метод является стандартным обходным путем для обработки такого рода зависимостей в конструкторах ( 1 2 3 ). Альтернатива состоит в том, чтобы ждать реальных типов объединений в Dotty (текущий подход - их частичная эмуляция) или разрешать SI-5712 в Scala.

Для автоматической генерации сопутствующих объектов вы можете рассмотреть макросы или генерацию кода.

11
задан Milan Gardian 23 January 2009 в 06:07
поделиться

4 ответа

Самый простой вызов встроенной сборки, который работал и произвел вывод, был:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Engine, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
$engine = New-Object Microsoft.Build.BuildEngine.Engine
$engine.RegisterLogger((New-Object Microsoft.Build.BuildEngine.ConsoleLogger))
$engine.BuildProjectFile('fullPath\some.proj')

Однако это оказывается встраиванием, MSBuild непосредственно в Powershell (V1) проблематичен:

'MSBUILD : warning MSB4056: The MSBuild engine must be called on
a single-threaded-apartment. Current threading model is "MTA".
Proceeding, but some tasks may not function correctly.'

Почему, о, почему мы все еще платим налог COM в 2009 при работе в управляемой среде?

Мое заключение состоит в том, что встраивание MSBuild в Powershell (V1) не является хорошей идеей. Для ссылки я также включаю основанный на процессе подход, который я закончил тем, что использовал:

[void][System.Reflection.Assembly]::Load('Microsoft.Build.Utilities.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
$msbuild = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFrameworkFile("msbuild.exe", "VersionLatest")
&$msbuild fullPath\some.proj
14
ответ дан 3 December 2019 в 04:14
поделиться

Другое и потенциально больше применимого подхода должны были бы сделать msbuild cmdlet. MsBuild имеет хороший API и существует много образцов там о том, как использовать его со скомпилированного языка, такого как C#/VB. Было бы очень легко создать cmdlet, который предоставит намного более хороший синтаксис Вашим powershell сценариям.

3
ответ дан 3 December 2019 в 04:14
поделиться

Я очень высоко предложил бы смотреть на PSake.

Позвольте мне заключить часть в кавычки той страницы:

Помните, что это говорило, синтаксический сахар вокруг PowerShell. Таким образом, что-либо, что можно сделать в PowerShell, в котором можно выполнить, говорило. Это означает, что можно запустить MSBuild, NAnt или другие сценарии. Нет никакой потребности полностью заменить Вашу текущую систему сборки. Можно использовать, говорил, чтобы автоматизировать и расширить его!

говорил автоматически добавляет соответствующую версию Платформы.NET к ее пути. Таким образом, можно получить доступ к MSBuild, csc.exe, vbc.exe или любым другим инструментам, установленным в $env:windir\Microsoft.NET\Framework\$version\без полностью определенного пути.

5
ответ дан 3 December 2019 в 04:14
поделиться

Я искал это то же самое. При следовании примеру JaredPar я нашел следующее:

Это - практическое руководство при создании cmdlet.

http://bartdesmet.net/blogs/bart/archive/2008/02/03/easy-windows-powershell-cmdlet-development-and-debugging.aspx

API MSBuild является частью этих пространств имен:

Microsoft.Build.Framework

Microsoft.Build.BuildEngine

И документация MSBuild может быть найдена здесь (это больше для полноты, чем в ответ на Ваш вопрос):

http://msdn.microsoft.com/en-us/library/wea2sca5.aspx

3
ответ дан 3 December 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: