0
votes

I need to build at the solution level using MSBuild since I have multiple configurations. I have a custom target in my web project that publishes the output. I can specify the web project as the target and it builds fine. But I need to publish the web application. Is there a way to build a project's custom target when building at the solution level?

I found this link, but I don't understand the solution. If someone could break that down a little, it would help a lot.

This is what my current PowerShell command-line looks like:

& "$env:windir\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" `
    "..\..\Solution.sln" `
    "/t:WebApplication:PublishToFileSystem" `
    "/p:Configuration=$configuration;PublishDestination=$publishPath"

The :PublishToFileSystem causes it to fail, with this message:

error MSB4057: The target "PublishToFileSystem" does not exist in the project. [C:\Source\Solution.sln]

This is what my custom target in my .csproj file looks like:

<Target Name="PublishToFileSystem" DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''" Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))" Directories="$(PublishDestination)" />
    <ItemGroup>
      <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>
    <Copy SourceFiles="@(PublishFiles)" DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="True" />
</Target>
1

1 Answers

0
votes

So, after some research, I found that creating a custom target is not the best way to publish a web application. Assuming you have just one web project in your solution, MS extended MSBuild to use publish profiles (the same ones used when you publish in Visual Studio). I was able to create a separate publish profile for each configuration (environment) and call the following command line:

& "$env:windir\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe" `
    "..\..\Solution.sln" `
    "/p:DeployOnBuild=true" `
    "/p:PublishProfile=$configuration"

I just had to make sure my publish profiles had the same name as my $configuration.

publish profiles