我有以下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)只要它们尚未存在并且是最新的.
但目标CopyToDirA和CopyToDirB看起来相同,除了一个副本$(DirA)和另一个 - 到$(DirB).是否有可能将它们统一到一个首先调用的目标中$(DirA)然后用$(DirB)?
谢谢.
乍一看,我的问题似乎很常见:我的一些项目中有一个自定义的MS Build任务.编译项目后,我无法再编译构建任务 - 构建任务程序集被Visual Studio锁定.
我发现这里有很多帖子说"只是从AppDomainIsolatedTask继承".
我的任务已经完成了.该程序集除此任务外不包含其他内容.似乎卸载了AppDomain,至少触发了DomainUnload事件.并且,依赖程序集正确卸载.
但是,包含构建任务本身的程序集由devenv.exe(我由ProcessExplorer双重检查)锁定.
我发现另一篇文章说'将GenerateResourceNeverLockTypeAssemblies属性设置为true',这听起来很有希望,但也没有帮助.
所以,我想知道还有什么可能出错.无论我使用VS2008还是2010,行为都是一样的.
我正在尝试使用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很新,所以我觉得我在这里缺少一些非常基本的东西.
任何帮助将不胜感激.
我目前正在将我的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键?我已经尝试了所有'逻辑'分隔符(空格,逗号,分号,管道符号),但这不起作用.
有其他人遇到过这个问题吗?
解决方案不起作用:
当我在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)
我从文件中得到通常看起来像这样的文本
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()""
我知道ReadLinesFromFile的代码将一次拉取一行数据并去除回车.
有没有办法把它们放回去?所以我的电子邮件看起来格式很好?
谢谢
我有一个基于TFS服务器的解决方案.此解决方案包括几个具有自定义MSBuild任务的项目.这些任务实际上创建了一些zip存档.
我需要以某种方式从TFS构建中提取$(Rev)宏并将其传递给任务.我尝试在构建定义的进程选项卡中使用MSBuildArguments,当我设置一个简单的字符串值时,它可以工作:
/ P:版本= "5"
但它不适用于宏:
/ P:版本= "$(启:R)"

你有什么想法?
编辑:我实际上需要BuildDetail.BuildNumber.
我只需要更改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不变.那么,有什么任务可以做到这一点吗?或者可以用正则表达式完成吗?那么正则表达式会是什么?
我正在使用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脚本中,我在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月没有前导零,你可以看到)
我正在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
msbuild ×10
msbuild-task ×10
date ×1
deployment ×1
msbuild-4.0 ×1
scripting ×1
tfs ×1
tfs2010 ×1
tfsbuild ×1
webpack ×1
wix ×1