我在目标项目中有一个.config,我需要通过MSBuild任务以编程方式添加一行.
Pseduo运营如:
$ TargetProjectDir\Config\packages.config中的.config文件:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ABC" version="1.1.0.4" />
<package id="XYZ" version="2.0.0.0" />
</packages>
Run Code Online (Sandbox Code Playgroud)
之后需要看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ABC" version="1.1.0.4" />
<package id="XYZ" version="2.0.0.0" />
<package id="CarDataWidget" version="3.0.0.0" />
</packages>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经考虑过使用"内联任务","执行"任务和"XmlPoke"任务,但还没有设法让任何一个工作.
这是我对XmlPoke和XmlPeek的尝试:
我使用以下文章作为如何将节点添加到packages.config文件的灵感:http: //weblogs.asp.net/bsimser/appending-nodes-in-xml-files-with-xmlpeek-and-xmlpoke-使用-恶性
<Target Name="AfterBuild" DependsOnTargets="AddPackage">
</Target>
<Target Name="AddPackage">
<!-- Load existing nodes into a Property -->
<XmlPeek XmlInputPath="config/packages.config" Query="/packages/package" >
<Output TaskParameter="Result" PropertyName="Peeked" />
</XmlPeek>
<Message Text="From Peek: $(Peeked)"></Message>
<!-- Load new node into Property -->
<PropertyGroup> …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照如何调用相同的 msbuild 目标两次?中概述的基本模型在 msbuild 中创建可重用的目标。
我试图传递一个我想解释为列表的属性。我在网上没有找到处理这种情况的例子。据我了解,问题在于 Properties 已经被视为列表项,因此它不喜欢传入列表项。有没有办法让 msbuild 在这里正确打包和解包列表?
Msbuild 抱怨:
error MSB4012: The expression "FilesToZip=@(Scripts)" cannot be used in this context. Item lists cannot be concatenated with other strings where an item list is expected. Use a semicolon to separate multiple item lists.
Run Code Online (Sandbox Code Playgroud)
这是一个调用者示例:
<Target Name="BuildMigrationZip">
<MSBuild Projects="BuildZip.msbuild"
Targets="BuildZip"
Properties="FilesToZip=@(Scripts);OutputZipFile=$(MigrationPackageFilePath);OutputFolder=$(MigrationPackagePath);Flatten=true"/>
<Message Text="Created database migration zip: $(MigrationPackageFilePath)" Importance="high"/>
</Target>
Run Code Online (Sandbox Code Playgroud)
和基本目标:
<Target Name="BuildZip">
<MakeDir Directories="$(OutputFolder)"/>
<Zip Files="@(FilesToZip)"
ZipFileName="$(OutputZipFile)"
Flatten="$(Flatten)"
ParallelCompression="false" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我基本上正要回去剪切和粘贴这些内容,尽管我想在这里打包一些拉链。
更新:同样的问题适用于在可重用目标上设置输入。到目前为止,我的问题解决了原始功能,但保持依赖关系正常工作会很好。例如:
<Target Name="BuildZip"
Inputs="@(FilesToZip)"
Outputs="$(OutputZipFile)"> …Run Code Online (Sandbox Code Playgroud) 我有一个旧的类库项目,在以前版本的 Visual Studio (2017 IIRC) 中构建得很好。该项目包含一个基于 HLSL 的像素着色器,可生成径向颜色选择器。我刚刚将它移植到 VS2022,它不再构建,告诉我它找不到构建任务。这是错误消息:
无法从程序集 ShaderBuildTask 加载“ShaderBuildTask.PixelShaderCompile”任务,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125。无法加载文件或程序集“ShaderBuildTask,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125”或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项均可用,并且任务包含实现 Microsoft.Build.Framework.ITask.AngularGradientShaderEffect 的公共类
我已经ShaderBuildTaskSetup.msi在我的机器上安装了所需的着色器编译器 ( )。重新加载项目并重新启动 VS 也没有帮助。
有人在 VS2022 中使用像素着色器来看看我缺少什么吗?
我们正在使用CCNet 1.4.4.83但是当MSBuild任务失败时,我们不会在电子邮件通知中获得MSBuild结果(即丢失文件或编译失败的原因).
我确实在CCNet网站(仪表板)上看到了构建失败.
我可以在artifacts文件夹中看到一个名为msbuild-results.xml的文件,因此msbuild任务看起来像是正确配置的.
看起来由于某种原因,在创建电子邮件通知时,但是在查看仪表板时,结果不会合并.
电子邮件任务位于publishers部分和标记之后.
我错过了什么?
目前我正在尝试将文件复制到用户配置文件中的某个位置,但是在声明动态配置文件名称时遇到问题,例如:
<Target Name="CopyScript">
<MsBuild Projects="JsProject.csproj" />
<Copy SourceFiles="$(ProjectDir)\myScript.js" DestinationFolder="$(systemdrive)\Documents and Settings\$(userProfileName)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
声明动态用户配置文件名称的语法是什么?我是否必须从某个地方获取配置文件名称,或者是否有另一个MsBuild任务可以找到它?
谢谢.
我已经创建了一个MSBuild.xml文件来自动化我的ASP.NET项目构建.它构建项目,发布它,拉链并将zip复制到网络共享.如果我之前已经登录过网络文件夹,这一切都完美无缺.访问网络共享后,会记住用户名和密码,直到我退出计算机.如果我以前没有登录,则在运行构建文件时出现"失败:未知用户名或密码错误"错误.无论我以前是否访问过网络共享,我都希望构建工作始终有效.
目前我正在使用复制任务将zip文件复制到网络共享.我已经检查了复制任务文档,但我看不到任何包含凭据的方法.那么,如何将文件复制到网络共享传递所需的用户名和密码?
这是我正在使用的复制任务的示例.所有属性都在MSBuild.xml文件的顶部定义:
<Target Name="CopyToServer">
<Copy SourceFiles="$(ReleaseFolder)\$(ZipFileName).zip" DestinationFolder="$(WebServerRoot)" />
</Target>
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MSBuild Copy任务将由我的版本创建的二进制文件复制到某个文件夹。不幸的是,该过程无声地失败了。没有发出错误消息,也没有文件被复制。
这是我的.csproj文件的相关部分:
<Target Name="CopyFilesForModule" AfterTargets="AfterBuild">
<CreateItem Include="bin\**\*.*" Exclude="bin\**\*.pdb;bin\**\*.xml">
<Output TaskParameter="Include" ItemName="MySourceFiles" />
</CreateItem>
<Copy SourceFiles="$(MySourceFiles)" DestinationFolder="Areas\KoobooModule7\bin">
<Output
TaskParameter="CopiedFiles"
ItemName="Changed" />
</Copy>
<Message Text="sourcefiles: @(MySourceFiles)" />
<Message Text="changed:@(Changed)" Importance="high" />
</Target>
Run Code Online (Sandbox Code Playgroud)
如您所见,我已经添加了用于调试目的的消息。我使用以下命令行调用msbuild:
“ c:\ Program Files(x86)\ MSBuild \ 12.0 \ Bin \ MSBuild.exe” / t:rebuild / verbosity:d iag KoobooModule7.csproj> buildlog.txt
这是我的构建日志中的相关摘录:
项目“ C:\ Users \ chris \ Documents \ Visual Studio 2013 \ Projects \ KoobooModule7 \ KoobooModule7 \ KoobooModule7.csproj”中的目标“ CopyFilesForModule:(TargetId:75)”(目标“生成”取决于它): 任务“ CreateItem”(TaskId:43) 任务参数:Include = bin \ ** \ *。*(TaskId:43) …
这是一个与我的整体问题有关的较小问题。这就是我想要完成的。
我创建了一个修改我的源文件的任务。每当我编译和构建时,我都希望使用修改后的cs文件进行编译。香港专业教育学院试图做一个控制台应用程序,我从prebuild事件调用,但我发现只有一些修改的文件被编译。即使我没有在编辑器中打开它们。然后,我尝试在csproj文件中使用与以下xml一起使用的自定义任务:
<Target Name="BeforeCompile">
<MyCustomTask />
</Target>
Run Code Online (Sandbox Code Playgroud)
而且我还用它来获得相同的结果:
<PropertyGroup>
<CompileDependsOn>
$(CompileDependsOn);
MyCustomTarget;
</CompileDependsOn>
</PropertyGroup>
<Target Name="MyCustomTarget">
<MyCustomTask />
</Target>
Run Code Online (Sandbox Code Playgroud)
这样就可以完成我想做的事情,但是我发现,每当加载项目文件时,它都会触发我的目标。我认为这只会在编译我的代码时运行。因此很明显,它是在编译或加载项目文件时触发与编译相关的目标的。
理想情况下,我希望仅在我明确构建项目时(即,手动构建或开始调试时)才触发该目标。我可以做些什么来实现这一目标?
我创建了一个在构建操作后执行的自定义任务。
<Target Name="AfterBuild" />
<Target Name="MyTarget"
AfterTargets="AfterBuild">
<MyTask ... />
</Target>
Run Code Online (Sandbox Code Playgroud)
问题:是否可以执行任务,如果构建操作被触发,但没有执行,因为项目中没有更改/不需要再次构建?
换句话说:我想总是在构建过程结束时执行任务,即使项目没有再次构建。
更新:使用AfterTargets="Build" 或设置属性没有帮助。<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
第二次触发构建过程后,我只得到输出: Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped
在Visual Studio 2012中,我运行了以下Post-Build任务来编译和组合我的LESS文件:
$(MSBuildBinPath)\msbuild.exe "$(ProjectDir)MSBuildSettingsLess.xml"
Run Code Online (Sandbox Code Playgroud)
我的MSBuildSettingsLess.xml看起来像:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/MsBuild/2003">
<Target Name="CompileDotlessCss">
<ItemGroup>
<Binaries Include="*.dll;*.exe"/>
</ItemGroup>
<!-- Compile dotLess CSS into minified full CSS -->
<Exec Command="$(SolutionDir)..\Tools\dotless.compiler.exe $(ProjectDir)..\GMHC\Content\less\responsive.less $(ProjectDir)..\GMHC\Content\bootstrap-responsive.less.css"/>
<Exec Command="$(SolutionDir)..\Tools\dotless.compiler.exe $(ProjectDir)..\GMHC\Content\less\bootstrap.less $(ProjectDir)..\GMHC\Content\bootstrap.less.css"/>
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2013中,失败并出现以下错误:
命令"C:\ Program Files(x86)\ MSBuild\12.0\bin\msbuild.exe"C:\ Users\Administrator\Documents\Projects\MedicalMissions\GMHC\MSBuildSettingsLess.xml退出,代码为9009.
输出窗口显示以下内容:
1>'C:\ Program'不被识别为内部或外部命令,
1>可操作程序或批处理文件.
1> C:\ Program Files(x86)\ MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(4429,5):错误MSB3073:命令"C:\ Program Files(x86)\ MSBuild\12.0\bin\msbuild.exe"C:\ Users\Administrator\Documents\Projects\MedicalMissions\GMHC\MSBuildSettingsLess.xml"
知道为什么失败或者如何走到最底层?