p.q*_*p.q 22 msbuild msbuild-task buildconfiguration
我正在尝试编辑我的项目文件,以便让我拥有一个可以同时构建多个构建配置的项目.我使用批处理方法并使用MSBuild任务(见下文)完成了这项工作.
如果我运行脚本,我会收到此错误:
错误103未为项目"ThisMSBuildProjectFile.csproj"设置OutputPath属性.请检查以确保您为此项目指定了Configuration和Platform的有效组合.Configuration ='Debug'Blatform ='AnyCPU'.
如果我从MSBuild任务添加或省略OutputPath,我会得到这个.如果使用VS2010调试器逐步执行脚本并调用MSBuild任务 - 调试器再次进入文件然后进入OutputPath,那么afaik,它应该选择该值,不是吗?
任何帮助都将非常感激 - 它让我发疯.谢谢,保罗.
这个MSBuildProjectFile.csproj(剩余的东西取出):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- Only Import normal targets if not building multiple projects -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" Condition="'$(Configuration)|$(Platform)' != 'AllBuild|AnyCPU' "/>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>C:\Folder\Etc\Output\$(Configuration)\</OutputPath>
<OutDir>C:\Folder\Etc\Output\$(Configuration)\</OutDir>
<BaseOutputPath>C:\Folder\Etc\Output\$(Configuration)\</BaseOutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<!-- Common -->
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<Platform>AnyCPU</Platform>
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<ItemGroup>
<Projects Include="C:\Folder\Etc\ThisMSBuildProjectFile.csproj" />
</ItemGroup>
<!-- Call this project file again, but with a different configuration - if this was working, this would call multiple build configs -->
<Target Name="Build" Condition="'$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' ">
<Message Text="hm!"/>
<!-- Tried thiswith and without the OutputPath property - makes no difference. -->
<MSBuild Projects="@(Projects)" Properties="Configuration=Debug;OutputPath=C:\Folder\Etc\Output\" ToolsVersion="4.0" Condition="'$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' "/>
</Target>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'AllBuild|AnyCPU' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<!-- Project files -->
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Blah\Blah.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
Mil*_*ian 20
重要的是要意识到当您使用"MSBuild"任务时,将启动一个新的子MSStild进程.这意味着您在父MSBuild进程中定义的任何项和属性都不会自动传递给子MSBuild进程/可见,除非您通过元素上的Properties属性明确地传递它们MSBuild(如<MSbuild Properties="..." />).
为了回答您的问题,我编写了以下自包含示例,该示例为所有指定的配置运行子MSBuild项目:
首先,为MSBuild实验创建一个目录(例如我使用过C:\temp\msbuildtest)
在此目录中,创建第一个文件main.proj:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<ItemGroup>
<ConfigList Condition=" '@(ConfigList)' == '' and $(Config) != '' " Include="$(Config.Split('+'))" /><!-- parse all requested configurations into a list -->
<ConfigList Condition=" '@(ConfigList)' == '' " Include="Debug" /><!-- if no configurations were specified, default to Debug -->
</ItemGroup>
<!--
Build the child project for each requested configuration. -->
<Target Name="Build">
<MSBuild Projects="$(MSBuildProjectDirectory)\child.proj" Properties="Configuration=%(ConfigList.Identity);OutputPath=$(MSBuildProjectDirectory)\bin\%(ConfigList.Identity)" Targets="Build" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)在同一目录中,创建第二个文件,child.proj(在您的情况下,这将是您正在尝试构建的实际C#项目,但因为我试图说明我的观点,我正在使用一个简单的子项目,而不是运行C#编译器只打印属性值:-))
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<Target Name="Build">
<Message Text="Building configuration $(Configuration) with output path $(OutputPath)" Importance="High" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)现在您可以运行该示例.首先是默认值,如果您没有明确指定要构建的配置:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild main.proj
> (cut the noise)
> Build:
> Building configuration Debug with output path C:\temp_c\d\bin\Debug
Run Code Online (Sandbox Code Playgroud)
然后明确指定多个配置:
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild main.proj /property:Config=Debug+Release+Staging+Production
> (cut the noise)
> Build:
> Building configuration Debug with output path C:\temp_c\d\bin\Debug
> Build:
> Building configuration Release with output path C:\temp_c\d\bin\Release
> Build:
> Building configuration Staging with output path C:\temp_c\d\bin\Staging
> Build:
> Building configuration Production with output path C:\temp_c\d\bin\Production
Run Code Online (Sandbox Code Playgroud)您应该能够根据您的情况调整此技术.
项目文件中没有任何问题。考虑以下XML:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == '' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>C:\Folder\Etc\Output\$(Configuration)\</OutputPath>
...
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
这些属性永远都不能设置,因为即使$(Configuration)和$(Platform)为空,当用bar字符加以填充时,它们也永远无法匹配空字符串;该条件的最小值为“ |” 并不是 ''。即使通过将条件与“ |”进行比较来进行纠正,您也可以继续尝试在该PropertyGroup的OutputPath中使用$(Configuration),但是$(Configuration)在使用该点时永远不会有值。同样,在尝试将$(Platform)设置为“ AnyCPU”的情况下,它必须已经具有该值。您可能打算完全省略第一个PropertyGroup上的条件,并且可能还需要在没有条件的早期PropertyGroup中提供$(Configuration)和$(Platform)的默认值。
还要注意,在覆盖“ Build”目标时,MSBuild任务上存在多余的条件;条件相同的情况下,您不需要执行任何任务。
| 归档时间: |
|
| 查看次数: |
37082 次 |
| 最近记录: |