标签: msbuild-task

如何使用msbuild项目文件本身内的不同参数两次调用相同的msbuild目标

我有以下msbuild代码:

  <PropertyGroup>
    <DirA>C:\DirA\</DirA>
    <DirB>C:\DirB\</DirB>
  </PropertyGroup>

  <Target Name="CopyToDirA"
          Condition="Exists('$(DirA)') AND '@(FilesToCopy)' != ''"
          Inputs="@(FilesToCopy)"
          Outputs="@(FilesToCopy -> '$(DirA)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirA)" />
  </Target>

  <Target Name="CopyToDirB"
          Condition="Exists('$(DirB)') AND '@(FilesToCopy)' != ''"
          Inputs="@(FilesToCopy)"
          Outputs="@(FilesToCopy -> '$(DirB)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DirB)" />
  </Target>

  <Target Name="CopyFiles" DependsOnTargets="CopyToDirA;CopyToDirB"/>
Run Code Online (Sandbox Code Playgroud)

因此,调用目标CopyFiles会将相关文件复制到,$(DirA)并且$(DirB)只要它们尚未存在并且是最新的.

但目标CopyToDirACopyToDirB看起来相同,除了一个副本$(DirA)和另一个 - 到$(DirB).是否有可能将它们统一到一个首先调用的目标中$(DirA)然后用$(DirB)

谢谢.

msbuild msbuild-task

16
推荐指数
2
解决办法
1万
查看次数

自定义MSBuild任务锁定程序集

乍一看,我的问题似乎很常见:我的一些项目中有一个自定义的MS Build任务.编译项目后,我无法再编译构建任务 - 构建任务程序集被Visual Studio锁定.

我发现这里有很多帖子说"只是从AppDomainIsolatedTask继承".

我的任务已经完成了.该程序集除此任务外不包含其他内容.似乎卸载了AppDomain,至少触发了DomainUnload事件.并且,依赖程序集正确卸载.

但是,包含构建任务本身的程序集由devenv.exe(我由ProcessExplorer双重检查)锁定.

我发现另一篇文章说'将GenerateResourceNeverLockTypeAssemblies属性设置为true',这听起来很有希望,但也没有帮助.

所以,我想知道还有什么可能出错.无论我使用VS2008还是2010,行为都是一样的.

msbuild msbuild-task

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

如何使用MSBuild复制任务复制到多个目标文件夹?

我正在尝试使用MSBuild的复制任务递归地将文件夹复制到多个目标文件夹.我看到以下问题给了我一个良好的开端,但我必须遗漏一些东西:

Msbuild根据目标参数列表复制到多个位置?

我的构建文件中的代码段如下:

<ItemGroup>
    <DeployPath Include="\\server1\path" />
    <DeployPath Include="\\server2\path" />
</Item Group>

<Target Name="Deploy">
    <Message Text="%(DeployPath.Identity)" />
    <Copy SourceFiles="@(ItemsToCopy)" DestinationFolder="%(DeployPath.Identity)\%(RecursiveDir)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

当我运行它时,正如我所料,"消息"任务会吐出2行:

\\server1\path
\\server2\path
Run Code Online (Sandbox Code Playgroud)

问题是,"复制"任务似乎只运行一次,并将文件复制到当前硬盘驱动器的根目录而不是指定的网络路径:

复制到C:\file1.txt而不是\\server1\path\file1.txt

我对MSBuild很新,所以我觉得我在这里缺少一些非常基本的东西.

任何帮助将不胜感激.

msbuild msbuild-task

15
推荐指数
2
解决办法
8662
查看次数

使用MSBuild将多个值传递给Wix DefineConstants属性

我目前正在将我的Wix项目集成到MSBuild中.我有必要将多个值传递给Wix项目.一个值将起作用(下面示例中的ProductVersion).

<Target Name="BuildWixSetups">
    <MSBuild Condition="'%(WixSetups.Identity)'!=''"
                Projects="%(WixSetups.Identity)"
                Targets="Rebuild" Properties="Configuration=Release;OutputPath=$(OutDir);DefineConstants=ProductVersion=%(WixSetups.ISVersion)" ContinueOnError="true"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

但是,如何将多个值传递给DefineConstants键?我已经尝试了所有'逻辑'分隔符(空格,逗号,分号,管道符号),但这不起作用.

有其他人遇到过这个问题吗?

解决方案不起作用:

  1. 尝试添加DefineConstants元素不起作用,因为需要在Properties属性中表达DefineConstants.

msbuild wix msbuild-task

14
推荐指数
3
解决办法
2万
查看次数

MSBuild ReadLinesFromFile一行上的所有文本

当我在MSBUILD中的文件上执行ReadLinesFromFile并再次输出该文件时,我将所有文本放在一行上.所有Carriage返回和LineFeeds都被删除.

<Project DefaultTargets = "Deploy"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<Import  Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

<ItemGroup>
    <MyTextFile Include="$(ReleaseNotesDir)$(NewBuildNumber).txt"/>
</ItemGroup>

<Target Name="ReadReleaseNotes">
    <ReadLinesFromFile
        File="@(MyTextFile)" >
        <Output
            TaskParameter="Lines"
            ItemName="ReleaseNoteItems"/>
    </ReadLinesFromFile>
</Target>

<Target Name="MailUsers" DependsOnTargets="ReadReleaseNotes" >
    <Mail SmtpServer="$(MailServer)"
        To="$(MyEMail)"
        From="$(MyEMail)"
        Subject="Test Mail Task"
        Body="@(ReleaseNoteItems)" />
</Target>
<Target Name="Deploy">
    <CallTarget Targets="MailUsers" />
</Target>

</Project>
Run Code Online (Sandbox Code Playgroud)

我从文件中得到通常看起来像这样的文本

- New Deployment Tool for BLAH

- Random other stuff()""
Run Code Online (Sandbox Code Playgroud)

像这样出来

- New Deployment Tool for BLAH;- Random other stuff()""
Run Code Online (Sandbox Code Playgroud)

我知道ReadLinesFromFile的代码将一次拉取一行数据并去除回车.

有没有办法把它们放回去?所以我的电子邮件看起来格式很好?

谢谢

deployment msbuild msbuild-task msbuildcommunitytasks

13
推荐指数
3
解决办法
2万
查看次数

如何将TFS变量传递给项目的MSBuild任务

我有一个基于TFS服务器的解决方案.此解决方案包括几个具有自定义MSBuild任务的项目.这些任务实际上创建了一些zip存档.

我需要以某种方式从TFS构建中提取$(Rev)宏并将其传递给任务.我尝试在构建定义的进程选项卡中使用MSBuildArguments,当我设置一个简单的字符串值时,它可以工作:

/ P:版本= "5"

但它不适用于宏:

/ P:版本= "$(启:R)"

在此输入图像描述

你有什么想法?

编辑:我实际上需要BuildDetail.BuildNumber.

msbuild tfs msbuild-task tfs2010

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

使用MSBuild FileUpdate任务仅更改AssemblyInfo.cs中的版本号

我只需要更改AssemblyInfo.cs文件的修订号.版本号的格式为Major.Minor.Build.Revision,例如1.4.6.0.

目前我使用FileUpdate任务(来自MSBuild社区任务项目)和以下正则表达式更改版本:

<FileUpdate Files="@(AssemblyResult)"
    Regex='(\[\s*assembly:\s*AssemblyVersion\(\s*"[^\.]+\.[^\.]+)\.([^\.]+)(\.)([^\.]+)("\)\s*\])'
    ReplacementText='[assembly: AssemblyVersion("$(AssemblyMajorNumber).$(AssemblyMinorNumber).$(AssemblyBuildNumber).$(Revision)")]' />
Run Code Online (Sandbox Code Playgroud)

现在我只需要更新版本号并保持major,minor和build不变.那么,有什么任务可以做到这一点吗?或者可以用正则表达式完成吗?那么正则表达式会是什么?

msbuild msbuild-task

12
推荐指数
2
解决办法
8320
查看次数

如果使用ContinueOnError = true,如何检查MSBuild-Task是否失败

我正在使用ContinueOnError = true运行MSBuild任务:

<MSBuild Projects="@(ComponentToDeploy)"
    Targets="$(DeploymentTargets)"
    Properties="$(CommonProperties);%(AdditionalProperties)"
    ContinueOnError="true" 
    Condition="%(Condition)"/>
Run Code Online (Sandbox Code Playgroud)

所以我的构建总是成功的.

有没有办法找出是否发生任何错误?

我找不到包含此信息的MSBuild任务的任何输出.我知道的唯一方法是解析日志文件中的错误,但对我来说它看起来像是一种解决方法.

(我正在使用MSBuild 4.0)


这是@Ilya最后反馈的答案.
我正在使用反馈/答案,因为评论的长度和格式限制.

日志范围限定为单个目标或更具体的任务......

这确实是我在阅读您的评论时出现的第一个问题,建议使用Log.HasLoggedErrors:" 这是日志的范围吗? ".
不幸的是,我无法找到合适的文档.MSND没有多大帮助......
为什么你知道它的任务范围是什么?
我对你的陈述毫不怀疑!我只是想知道某处是否有适当的文档..(我多年没有使用过MSBuild ;-)

无论如何,你在建设什么项目?

我的测试项目非常简单.
MyTest.project

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="ElenasTarget" ToolsVersion="4.0">

    <UsingTask AssemblyFile="$(MSBuildProjectDirectory)\MyCompany.Tools.MSBuild.Tasks.dll" TaskName="MSBuildWithHasLoggedErrors" />

    <ItemGroup>
        <MyProjects Include="CopyNotExistingFile.proj" />
    </ItemGroup>

    <Target Name="ElenasTarget">
        <MSBuildWithHasLoggedErrors Projects="@(MyProjects)" ContinueOnError="true" >
            <Output TaskParameter="HasLoggedErrors" PropertyName="BuildFailed" />
         </MSBuildWithHasLoggedErrors>

         <Message Text="BuildFailed=$(BuildFailed)" />
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

CopyNotExistingFile.proj只是试图复制不存在的文件:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" …
Run Code Online (Sandbox Code Playgroud)

msbuild msbuild-task msbuild-4.0

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

msbuild脚本中的日期格式?

在我的msbuild脚本中,我在zip文件名中创建了一个包含年/月/日的zip文件,但是月和日总是写成没有前导零.

有没有办法将前导零添加到我的zip文件名?

<Time>
  <Output TaskParameter="Year" PropertyName="Year" />
  <Output TaskParameter="Month" PropertyName="Month" />
  <Output TaskParameter="Day" PropertyName="Day" />
</Time>

<PropertyGroup>
  <ZipOutDir>C:\output</ZipOutDir>
  <ZipFileName>Application_$(Year)$(Month)$(Day).zip</ZipFileName>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

结果是:'Application_2010122.zip'(1月没有前导零,你可以看到)

msbuild scripting date msbuild-task msbuildcommunitytasks

11
推荐指数
2
解决办法
7253
查看次数

MSBuild和Webpack

我正在VS2015中开发一个Angular2应用程序,并为此设置了一个webpack捆绑和缩小环境.

这是我的webpack.conf.js

switch (process.env.NODE_ENV) {
    case 'prod':
    case 'production':
        module.exports = require('./config/webpack.prod');
        break;
    case 'test':
    case 'testing':
        //module.exports = require('./config/webpack.test');
        break;
    case 'dev':
    case 'development':
    default:
        module.exports = require('./config/webpack.dev');
}
Run Code Online (Sandbox Code Playgroud)

我还安装了一个webpack任务运行器,它使用以下命令调用它

cmd /c SET NODE_ENV=development&& webpack -d --color
Run Code Online (Sandbox Code Playgroud)

cmd /c SET NODE_ENV=production&& webpack -p --color
Run Code Online (Sandbox Code Playgroud)

设置似乎工作正常.但是,我想将其与我的TFS构建CI集成.构建项目后应触发webpack命令,并在webpack构建失败时报告构建失败.我试图在我的.csproj文件中包含以下代码

<Target Name="AfterBuild">
<Exec Condition="$(Configuration) == 'Debug'" Command="cmd /c SET NODE_ENV=production&& webpack -p --color">
</Exec>
</Target>
Run Code Online (Sandbox Code Playgroud)

它失败了,错误9009

之后我尝试了,从安装了webpack的node_modules文件夹启动命令

<Target Name="AfterBuild">
<Exec Condition="$(Configuration) == 'Debug'" Command="./node_modules/.bin cmd /c SET NODE_ENV=production&& webpack -p --color">
</Exec>
</Target> …
Run Code Online (Sandbox Code Playgroud)

msbuild continuous-integration msbuild-task tfsbuild webpack

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