Anthony Mastrean
Anthony Mastrean

Reputation: 22394

Why won't MSBuild build a project with a dot in the name?

The Story So Far

I've got a nice solution with a desktop application project, a few library projects, and a couple of development tools projects (also desktop applications). At the moment, my build server outputs all of the code into one OutputPath. So we end up with

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

But, we're growing up and people outside of our team want access to our tools. So I want to organize the output. I decided that what we would want is a different OutputPath per executable project

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
    ...

What I Did

I found this simple command. I like it because it retains all the Solution working-dir context that makes msbuild a pain.

msbuild /target:<ProjectName>

For example, from my solution root as a working directory, I would call

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

I'm testing this from PowerShell, so that $pwd resolves to the full path to my working directory, or the Solution root in this case. I get the output I desire.

However, when I run this command

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

I get the following error output (there's no more information, I ran with /verbosity:diagnostic)

The target "Company.MainApplication" does not exist in the project.


What I Need

The command fails on any project with a dot or dots in the name. I tried with many combinations of working directories and properties. I tried several ways of escaping the property values. I also tried running the command from a <Task> in a targets file.

I need to know either
A) How to fix this command to work property
B) How to achieve the same output with minimal friction

Upvotes: 26

Views: 7970

Answers (3)

brunzzy
brunzzy

Reputation: 71

Specify the target after the -target: switch in the format :. If the project name contains any of the characters %, $, @, ;, ., (, ), or ', replace them with an _ in the specified target name.

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

Dan Nolan's answer and comments are correct. Just want to supplement the Microsoft documentation.

Upvotes: 5

Dan Nolan
Dan Nolan

Reputation: 4772

Try using an underscore as an escape character for the dot in the target parameter, e.g.

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

Upvotes: 50

Ruben Bartelink
Ruben Bartelink

Reputation: 61795

The /targets: switch is to identify a <Target to run in the project file. You need to supply your .csproj file as a an argument that is not prefixed by a /xx option marker.

You might also want to work based on the .sln file. In that case, you still dont specify the project in the .sln to build in this manner. I'll leave you to search up the correct syntax in case that's what you end up doing.

Upvotes: -2

Related Questions