Подтвердить что ты не робот

Почему MSBuild не будет создавать проект с точкой в ​​названии?

История до сих пор

У меня есть хорошее решение с проектом настольного приложения, несколькими библиотечными проектами и несколькими проектами средств разработки (также настольными приложениями). На данный момент мой сервер сборки выводит весь код в один OutputPath. Итак, мы закончили с

drop-x.y.z\  
  Company.MainApplication.exe      <-- main application   
  Company.MainApplicationCore.dll  <-- libraries  
  Helper.exe                       <-- developer tools  
  Grapher.exe  
  Parser.exe  
  ...                              <-- the rest of the output

Но мы росли, и люди за пределами нашей команды хотят получить доступ к нашим инструментам. Поэтому я хочу организовать выход. Я решил, что мы хотим, чтобы другой OutputPath для исполняемого проекта

drop-x.y.z\
  Company.MainApplication\
    Company.MainApplication.exe      <-- main application 
    Company.MainApplicationCore.dll  <-- libraries
    ...                              <-- application specific output
  Helper\
    Helper.exe                       <-- developer tools
    ...                              <-- tool specific output
  Grapher\
    Grapher.exe
    ...
  Parser\
    Parser.exe
    ...

Что я сделал

Я нашел эту простую команду. Мне нравится, потому что он сохраняет весь контекст рабочего-решения Solution, что делает msbuild болью.

msbuild /target:<ProjectName>

Например, из моего корня решения в качестве рабочего каталога я бы назвал

PS> msbuild /target:Helper /property:OutputPath="$pwd\out\Helper"

Я тестирую это из PowerShell, так что $pwd разрешает полный путь к моему рабочему каталогу или корень решения в этом случае. Я получаю желаемый результат.

Однако, когда я запускаю эту команду

PS> msbuild /target:Company.MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"

Я получаю следующий вывод ошибки (нет больше информации, я бежал с /verbosity:diagnostic)

Целевой "Company.MainApplication" не существует в проекте.


Что мне нужно

Команда не работает в любом проекте с точкой или точками в имени. Я пробовал со многими комбинациями рабочих каталогов и свойств. Я попробовал несколько способов избежать значений свойств. Я также попытался запустить команду из <Task> в файле целей.

Мне нужно знать, как A) Как исправить эту команду для работы свойства
B) Как добиться того же выхода с минимальным трением

4b9b3361

Ответ 1

Попробуйте использовать символ подчеркивания в качестве escape-символа для точки в целевом параметре, например

msbuild /target:Company_MainApplication /property:OutputPath="$pwd\out\Company.MainApplication"

Ответ 2

  Укажите цель после переключателя -target: в формате:. Если имя проекта содержит какие-либо символы%, $, @,;,., (,) Или ', замените их символом _ в указанном имени цели.

https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-build-specific-targets-in-solutions-by-using-msbuild-exe?view=vs-2019

Дан Нолан ответ и комментарии верны. Просто хочу дополнить документацию Microsoft.

Ответ 3

Переключатель /targets: должен идентифицировать <Target для запуска в файле проекта. Вам необходимо предоставить ваш файл .csproj как аргумент не с префиксом маркера /xx.

Вы также можете работать на основе .sln файла. В этом случае вы все равно не укажете проект в .sln для сборки таким образом. Я оставлю вас для поиска правильного синтаксиса в случае, если вы закончите делать.