- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
背景:StyleCop 提示自动生成的文件格式不正确,导致在我尝试构建项目时出现许多警告。自动生成的文件位于 obj/
中我的项目目录,我想创建一个 MSBuild 任务,它在 // <auto-generated/>
之前在编译之前(但在生成之后)到这个文件,这样 StyleCop 就不会提示。
问题:我有以下 MSBuild 代码
<!-- StyleCop complains about a file that's auto-generated by the designer,
so we need to prepend 'auto-generated' to it beforehand. -->
<Target Name="BeforeCompile" DependsOnTargets="MarkGeneratedFiles" />
<Target Name="MarkGeneratedFiles">
<PropertyGroup>
<GeneratedFilePath>$(MSBuildThisFileDirectory)obj\$(Configuration)\$(TargetFramework)\$(MSBuildProjectName).Program.cs</GeneratedFilePath>
</PropertyGroup>
<InsertIntoFile FilePath="$(GeneratedFilePath)" LineNumber="1" Text="// <auto-generated/>" />
</Target>
<!-- Code taken from http://stackoverflow.com/a/21500030/4077294 -->
<UsingTask
TaskName="InsertIntoFile"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<FilePath ParameterType="System.String" Required="true" />
<LineNumber ParameterType="System.Int32" Required="true" />
<Text ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Code Type="Fragment" Language="cs">
<![CDATA[
// By tradition, text file line numbering is 1-based
var lines = File.Exists(FilePath)
? File.ReadAllLines(FilePath).ToList()
: new List<String>(1);
lines.Insert(Math.Min(LineNumber - 1, lines.Count), Text);
File.WriteAllLines(FilePath, lines);
return true;
]]>
</Code>
</Task>
</UsingTask>
我要修改的文件的文件名是obj/Debug/netcoreapp1.0/BasicCompiler.Tests.Program.cs
.在上面的片段中,我有一个 BeforeCompile
取决于 MarkGeneratedFiles
的目标,它继续尝试插入 // <auto-generated/>
在该文件的第一行之前。
我已经测试过,如果生成的文件已经存在,这似乎工作正常。但是,如果我删除 obj/
目录或我从另一台机器构建,我得到这个错误:
"C:\cygwin64\home\james\Code\cs\BasicCompiler\src\BasicCompiler.Tests\BasicCompiler.Tests.csproj" (default target) (1) ->
(MarkGeneratedFiles target) ->
C:\cygwin64\home\james\Code\cs\BasicCompiler\src\BasicCompiler.Tests\BasicCompiler.Tests.csproj(68,5): error MSB4018: The "InsertIntoFile" task failed unexpectedly.\r
C:\cygwin64\home\james\Code\cs\BasicCompiler\src\BasicCompiler.Tests\BasicCompiler.Tests.csproj(68,5): error MSB4018: System.IO.DirectoryNotFoundException: Could not find
a part of the path 'C:\cygwin64\home\james\Code\cs\BasicCompiler\src\BasicCompiler.Tests\obj\Debug\netcoreapp1.0\BasicCompiler.Tests.Program.cs'.\r
基本上看起来目标在文件生成之前就已经运行了,所以没有什么可以放在文本前面的。有没有办法在生成此文件之后但编译之前运行它?
附加说明:到目前为止,我已经查看了所有特殊目标名称 here并尝试同时使用 BeforeBuild
和 BeforeCompile
.
此外,因为我使用的是"new"StyleCop,所以我不能输入 <ExcludeFromStyleCop>
在我的项目文件中。参见 https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1145
最佳答案
我设法解决了这个问题;查看@stijn 的 super 有用的评论 here .
首先,我从命令行运行了 msbuild/v:detailed
。这会增加 MSBuild 的冗长程度,以便您更详细地了解正在发生的事情,例如您可以看到正在运行的每个目标的名称。
我在日志中搜索了生成文件的目标名称。在我的例子中,结果是 GenerateProgramFiles
。
我用 AfterTargets="GenerateProgramFiles"
标记了我的自定义目标,因此它会在文件生成后运行。
关于c# - 如何在编译开始之前但在生成中间文件之后运行 MSBuild 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318530/
我有以下一段 msbuild 代码: C:\DirA\ C:\DirB\ '$(DirA)%(Filename)%(Extension)')">
我有一个 master.proj msbuild 脚本,它使用 MSBuild 任务构建多个项目。 这是一个典型的例子: 但是,我的问题是,如果在命令行上给出更多属性,它们不会传递给 MSB
我编写了一个自定义 MSBuild 任务,将其称为 TaskA,它解析文件并对其进行一些处理。我现在想编写另一个 MSBUild 任务,将其称为 TaskB,它在其中使用 TaskA。我知道我可以像使
我有好几次无法在 csproj 文件 (.NET Core) 中找到有关有效元素的信息。特别是具有 Content 和 Include/Exclude/Update/CopyToPublishDire
鉴于这样的事情.. DB1 Database
我有一个msbuild目标,它具有一个Import标签,如下所示: 在Company.LifeCycle.targets文件的内容中,如何以编程方式获取当前目录(在这种情况下为: C:\Progra
我在MSBuild脚本中创建的项目组的范围设置方面遇到一些问题。基本上,我想要做的是有两个不同的目标-我们将它们称为RunUnitTests和RunIntegrationTests-生成一个名为Tes
我希望下面的代码为 List 和 List2 生成相同的项目(我在搜索路径中有一个 cpp1 项目)。 '..\..\..\projects\**\%(identity).vcx
我正在编写一个 MSBuild 任务来升级数据库(完整源代码 here),遇到了一个我不知道如何处理的错误/设计特征。基本上,如果我声明: public int? TargetVersion {
MSBuild 针对最新目标发出以下消息: Skipping target "MyTarget" because all output files are up-to-date with respec
我正在为 msbuild 编写一个脚本,它应该在一个步骤中制作两批。 示例:2 个项目组 这两个组应该相互循环: 我希望 msbuild 使两个批次的结果都给出 1 A 2
我正在使用构建定义构建项目。执行此操作时,还会执行代码分析。代码分析输出各种文件,包括: ConsoleApplication2.exe.CodeAnalysisLog.xml ConsoleAppl
我正在尝试使用 MSBuild 从文本文件中读取文件列表,然后执行递归复制,将这些目录文件的内容复制到某个暂存区,同时排除某些扩展名(例如 .tmp 文件) 我已经设法使用 CreateItem 和
我有一个MSBuild项目,我希望将当前日期添加到正在创建的zip文件中。 我正在使用MSBuildCommunityTasks。 在网站http://msbuildtasks.tigris.or
我正在将一个 Web 应用程序包从 MSBuild 命令行部署到 IIS6 上的 MSDepSvc,它使用基本身份验证与以下命令一起正常工作: MSBuild.exe Web.csproj /p:
我有以下 MSBuild 脚本: test1;test2;test3 如果我调用不带任何参数的脚本,我会得
对于不是项目文件而是更复杂的构建脚本的 MSBuild 文件是否有标准文件扩展名? 我正在考虑 .msbuild.proj 以避免与其他 .proj 文件(我知道实际上是 MSBuild 文件)混淆。
假设我有两个耗时的目标,并且我想并行执行它们。假设一个目标运行单元测试,另一个目标生成一些文档。我尝试过这种方法: root.targets:
看起来(至少)有两个选项可以让 nant 使用 csproj 文件:使用 NAntContrib 的任务或直接使用 msbuild.exe (例如 codecampserver )。我读得对吗?如果是
如何获取内置 MSBuild 变量的列表? 我需要知道如何确定当前项目的 csproj 名称,并且认为了解我还能在 MSBuild 中找到什么内容可能会很有用。 最佳答案 来自 Microsoft 文
我是一名优秀的程序员,十分优秀!