标签: msbuild

MSBuild:编写并调用自定义任务,但MSBuild认为我需要一个TaskFactory

我正在进入MSBuild来处理项目的各种目标,我发现它非常灵活.(它也帮助我了解CI系统的可能性)

我需要获得项目的当前SVN修订版本,为此我编写了一个调用SubWCRev并解析输出的自定义任务.

我使用元素引用它:

<UsingTask TaskName="xxx.Elements.Build.MSBuildTasks.SubWCRev" AssemblyFile="D:\dev\xxx_presentation\Build\xxx.Elements.Build.dll">
    <ParameterGroup>
        <LastCommittedRevision ParameterType="System.Int" Required="False" Output="True" />
        <MixedRevisionRangeMinimum ParameterType="System.Int" Required="False" Output="True" />
        <MixedRevisionRangeMaximum ParameterType="System.Int" Required="False" Output="True" />
        <HasLocalModifications ParameterType="System.Boolean" Required="False" Output="True" />
    </ParameterGroup>
</UsingTask>
Run Code Online (Sandbox Code Playgroud)

然后我执行任务......

  <Target Name="Version" BeforeTargets="BuildDatabase">
        <xxx.Elements.Build.MSBuildTasks.SubWCRev WorkingCopyDir="$(ProjectDir)..">
            <Output TaskParameter="LastCommittedRevision" ItemName="LastCommittedRevision" />
            <Output TaskParameter="MixedRevisionRangeMinimum" ItemName="MixedRevisionRangeMinimum" />
            <Output TaskParameter="MixedRevisionRangeMaximum" ItemName="MixedRevisionRangeMaximum" />
            <Output TaskParameter="HasLocalModifications" ItemName="HasLocalModifications" />
        </xxx.Elements.Build.MSBuildTasks.SubWCRev>
        <Message Text="Revision is @(LastCommittedRevision)" />
    </Target>
Run Code Online (Sandbox Code Playgroud)

我的问题是MSBuild坚持使用TaskFactory属性,本文档说这是可选的.而且我也看到TaskFactory特别适用于内联任务,我对此并不感兴趣.

错误消息是:

必需属性"TaskFactory"在元素UsingTask中为空或缺少.

我哪里错了?

(顺便说一句,我发现MSBuild Sidekick 3非常出色并且减少了可能成为一个相当复杂的脚本的阻力.)

msbuild msbuild-task

1
推荐指数
1
解决办法
2996
查看次数

MSB4064:"MSBuild"任务不支持"BuildInParallel"参数

我有一个MSBuild构建文件,可以在我的本地开发框上正确运行但在我们的CI构建框上失败.

失败的构建目标如下:

<Target Name="Clean">
  <MSBuild Projects="Solution.sln" Targets="Clean" BuildInParallel="True"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

并且构建框上的错误是这样的:

"E:\TRUNK\build\Bamboo.build" (Build target) (1) ->
25-Oct-2011 10:22:51    (Clean target) -> 
25-Oct-2011 10:22:51      E:\TRUNK\build\build.build(19,55): error MSB4064: The "BuildInParallel" parameter is not supported by the "MSBuild" task. Verify the parameter exists on the task, and it is a settable public instance property.
25-Oct-2011 10:22:51      E:\TRUNK\build\build.build(19,5): error MSB4063: The "MSBuild" task could not be initialized with its input parameters. 
Run Code Online (Sandbox Code Playgroud)

两台机器报告都有MSBuild版本4.0.30319.1

Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.237]
Copyright (C) …
Run Code Online (Sandbox Code Playgroud)

msbuild continuous-integration

1
推荐指数
1
解决办法
1291
查看次数

清洁后,MSBuild ItemGroup为空

我看到ItemGroup标签有一些奇怪的行为.

我的应用程序依赖于几个DLL,我将这些DLL以及可执行文件复制到部署目录,NSIS使用该目录从新构建创建安装包.但是,我遇到了一个奇怪的问题.

我定义我的ItemGroup如下(在我定义构建目标之前在文件的顶部:

<MyAppFiles Include="$(ProjectRoot)\$(OutputPath)\*.dll;$(ProjectRoot)\$(OutputPath)\MyApp.exe" />
Run Code Online (Sandbox Code Playgroud)

因此,这会抓取目录中的所有DLL以及二进制文件MyApp.exe.但是,如果项目已被清理(即,没有文件$(OutputPath)).DLL不包含在ItemGroup文件列表中.现在,如果我用另一个构建来跟进它(即,有来自前一个构建的文件$(OutputPath)),则ItemGroup包含我想要的所有文件.

此外,我已检查构建脚本的输出,并将DLL复制到$(OutputPath)是否发生了清理.

所以,我的问题是,如何更正我的构建脚本,以便ItemGroup始终包含DLL?ItemGroup在构建发生之前,似乎填充了文件,因此如果在构建之前文件不存在,它们不会包含在列表中,但如果它们在构建之前存在,那么它们就是.

作为参考,这是我正在使用的构建目标:

<PropertyGroup>
    <MyAppRoot>..\MyApp</MyAppRoot>
    <MyAppProject>$(MyAppRoot)\MyApp.csproj</MyAppProject>
<PropertyGroup>

<Target Name="BuildProject">
    <Message Text="BEFORE: @(ProjectFiles)" />
    <MSBuild Projects="$(MyAppProject)" Targets="Build" Properties="Configuration=$(Configuration)">
      <Output TaskParameter="TargetOutputs" ItemName="MyAppAssembly"/>
    </MSBuild>
    <Message Text="AFTER: @(ProjectFiles)" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

msbuild visual-studio

1
推荐指数
1
解决办法
738
查看次数

如何使用PowerShell为MSBuild属性设置值

我有一个属性来指定构建驱动器:

<PropertyGroup>
    <BuildDrive Condition="'$(BuildDrive)'==''">Y:</Group>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

如果要使用批处理文件更改构建驱动器,可以执行以下操作:

@echo off

set buildDrive=H:

:: Then call MSBuild

Msbuild /t:BuildTarget %Projectfile% %Logger%
Run Code Online (Sandbox Code Playgroud)

现在,我想使用PowerShell实现相同的目的。

我在PowerShell脚本build.ps1中尝试了以下操作:

$BuildDrive=H:
MSbuild /t:BuildTarget $ProjectFile $Logger
Run Code Online (Sandbox Code Playgroud)

但是,它不遵守$ BuildDrive提供的驱动器号。我知道,如果我按如下方式传递参数,就可以实现,但是当属性数量更多时,这种方法就不方便了。

$BuildDrive=H:
Msbuild /t:BuildTarget /p:BuildDrive=$BuildDrive $projectfile $logger
Run Code Online (Sandbox Code Playgroud)

如何PropertyGroup通过PowerShell 传递值?

msbuild powershell powershell-2.0 msbuild-4.0

1
推荐指数
1
解决办法
1797
查看次数

只有在TeamCity构建时,才能构建神秘失败的沙堡

我有一个相当大的解决方案,其中包含两个基于Sandcastle + Sandcastle帮助文件生成器(SHFB)的文档项目.这些项目都可以从命令行(msbuild project.shfb)正确构建,也可以使用SHFB Visual Studio 2010集成的beta版本.

当我在TeamCity中运行构建时,我在文档构建中遇到了一个神秘的构建失败.SHFB日志说明了这一点:

      [Sandcastle Help File Builder, version 1.9.3.0]
      Cached Resolve Reference  Links 2 Component.  Copyright © 2006-2011, Eric Woodruff, All Rights Reserved
      http://SHFB.CodePlex.com
  Info: CachedResolveReferenceLinksComponent: Loaded 61 cached MSDN URL entries
  Info: SaveComponent: Instantiating component.
  Info: BuildAssembler: Building topic N:MyProject
  Info: BuildAssembler: Building topic T:MyProject.ActionNotImplementedException
  Info: BuildAssembler: Building topic AllMembers.T:MyProject.ActionNotImplementedException
  Info: BuildAssembler: Building topic Methods.T:MyProject.ActionNotImplementedException
  Info: BuildAssembler: Building topic Properties.T:MyProject.ActionNotImplementedException
  Info: BuildAssembler: Building topic Overload:MyProject.ActionNotImplementedException.#ctor
  Info: BuildAssembler: Building topic M:MyProject.ActionNotImplementedException.#ctor
  Info: BuildAssembler: …

msbuild sandcastle teamcity shfb

1
推荐指数
1
解决办法
2221
查看次数

从bat文件构建安装项目

我想使用bat文件构建安装项目,并希望生成msi。我尝试使用MSBuild.exe进行构建,如下所示

@echo off
call %windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe C:\Setup1\Setup1.sln
Run Code Online (Sandbox Code Playgroud)

但是,似乎MSBUILD不支持安装项目。还有其他想法使用bat文件构建安装项目吗?

.net msbuild windows-installer batch-file

1
推荐指数
1
解决办法
2636
查看次数

通过批处理文件在WPF项目上指定配置和平台时出现MSBuild错误

我必须承认,对于MSBuild和批处理文件,我有点像菜鸟,所以请耐心等待;)

我有一个文件夹结构,看起来像这样

/src
  /SLProject
        SLExampleProject.csproj
  /WPFProject
        WPFExampleProject.csproj
  ExampleSolution.sln
  Deploy.bat
Run Code Online (Sandbox Code Playgroud)

该解决方案包含多个Silverlight WPF项目,这些项目由/ SLProject和/ WPFProject级别的文件夹分隔.我正在尝试创建批处理文件Deploy.bat以在Silverlight和WPF项目的子集上执行MSBuild,将输出和xcopy DLL混淆到另一个文件夹.

我在与MSBuild相关的批处理文件中遇到问题.当我为要构建的第一个WPF项目指定平台和配置时,我收到错误"没有为项目设置OutputPath属性"...

MSBuild错误

以下是导致失败的批处理文件的行

call %windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe 
  /t:rebuild /p:Configuration=Release /p:Platform="Any CPU"    
  Abt.Controls.SciChart.Wpf/Abt.Controls.SciChart.Wpf.csproj
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么想法?我可以证实存在输出路径为这个项目设置和平台=释放和配置的组合=存在在建项目和它的依赖AnyCPU.

好奇地删除平台="任何CPU",构建成功...

msbuild wpf batch-file visual-studio-2010

1
推荐指数
1
解决办法
2092
查看次数

团队构建(TFS)中的UNC构建路径

我对TFS很新,所以当我想将目标目录设置为我的构建时,我遇到了这个问题.

每次我启动构建时,它都会大大失败并说"找不到\ xxxxxxx\yyyyy\zzzz".

我认为我的UNC路径是错误的.

假设我的放置目录(目标目录)是"C:\ Project \",我的计算机名称是"lemoos-PC",在UNC表示法中我的路径相当于什么?

我试过这些: \\lemoos-PC\C\Project\

\\lemoos-PC\C:\Project\

\\lemoos-PC\Project\

但他们似乎没有工作.

提前致谢 .

msbuild tfs path unc team-build

1
推荐指数
1
解决办法
1974
查看次数

MSBuild属性和变量重载

假设我启动一个构建脚本,定义名为SampleScript,指定参数/p:MyPrefix=Custom.脚本中有以下代码:

<PropertyGroup Condition="$(BuildDefinitionName)=='SampleScript'">
    <MyPrefix>Default</MyPrefix>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我得到的,首先将MyPrefix设置为"Custom",然后将其重载为"Default"(我是对的吗?).如果是这样,有没有办法让用户指定的参数更优先,所以它没有超载?

msbuild overloading build-script

1
推荐指数
1
解决办法
2056
查看次数

从tfs changeset获取文件列表

我需要从chageset获取已更改文件的列表,并排除所有其他垃圾.

我可以从命令tf changeset/i $(changesetnumber)获取此信息,但除了文件列表之外,我还有很多其他信息,我不需要这些信息用于我的目的.

或者也许有人可以告诉如何从ccnet获取此文件列表,以便我可以通过属性将其发送到我的msbuild.proj文件.

cruisecontrol.net msbuild tfs2010

1
推荐指数
1
解决办法
5245
查看次数