I finally realized why my BeforeBuild Target is no longer executing as expected — it’s so silly, it’s because the project’s configuration names had changed. But what I really want to do is test for the solution’s configuration name, not the project’s.
I know that the project’s configuration name is stored in $(Configuration). Is there one for the solution’s configuration name? Or is this simply not possible because (presumably) the solution names are only known to the configuration manager? If so, can anyone recommend a good method for managing configurations? I’d hate to have to add duplicate project configuration names everywhere…
UPDATE: after searching and reading some docs, I haven’t been able to find any proof that MSBuild is aware of the solution’s configuration name when its individual project files are compiled. I went ahead and build the solution from the command line, passing /v:diag, and dumped the output to a file. I searched through the file to find any signs of it knowing that the solution’s configuration name is “Deployment”, but the only occurences of that string appear when the BeforeBuild condition is checked.
The only solution I’ve come up with so far is to create my own environment variable on the TeamCity server, and have MSBuild check for its presence in the BeforeBuild target.
EDIT: I couldn’t use my own environment variable because it wasn’t getting passed to the build runner for some reason. But when I used /v:n in the TeamCity MSBuild settings, I noticed that there is $(COMPUTERNAME), which is exactly what I wanted anyway. I ended up trying this and it totally did the trick.