标签: msbuild-task

MSBuild将另一个项目的副本输出复制到当前项目的输出中

我有一种情况,我想使用MSBuild将输出程序集从一个项目复制到我的目标应用程序的输出目录中,而不需要在MSBuild Copy任务中使用硬编码路径.这是场景:

  • 项目A - Web应用程序项目
  • 项目B - Dal接口项目
  • 项目C - 达尔实施项目

还有一个Business层,但与我想要解决的MSBuild问题无关.

我的业务层有一个对我的Dal.Interface项目的引用.我的Web项目有一个对Business层的引用,并且就目前而言,执行构建会将业务层和Dal.Interface项目拉入输出.到现在为止还挺好.现在,为了运行Web应用程序,它需要Dal实现.我不想在任何地方引用实现,因为我想对接口强制执行编码而没有引用意味着它不会出现在intellisense等中.

所以我认为我可以通过MSBuild复制操作作为AfterBuild任务来处理这个问题(我在构建Web项目时构建了Dal实现设置,但没有引用).我不想在MSBuild参数中硬编码路径或其他任何东西,所以我试图弄清楚如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出.

所以根据上面提到的项目,我想看到的是:

  1. Web应用程序构建开始了
  2. 所有必需的项目都已构建(已配置,因此已完成)
  3. MSBuild"AfterBuild"任务启动,Project C(Dal Implementation)的输出被复制到Project A的Web目录(Web应用程序)

第3部分是我被困的地方.

我确信这可以做到,我只是找不到帮助的好参考.在此先感谢您的帮助.

msbuild msbuild-task

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

如何使用自定义msbuild任务读取注册表值?

我正在创建一个MSBuild任务,它将读取特定注册表项的注册表.如果我在控制台应用程序中编写相同的代码行(见下文),它将返回预期的结果,但是当它在MSBuild任务中时,它不返回任何内容.

Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)
Run Code Online (Sandbox Code Playgroud)

Nothing如果键/值对不存在,我希望上面的代码返回,如果它存在,则返回值.我Nothing在MSBuild任务执行时得到了.是否有一些属性需要应用于MSBuild任务的Execute函数来告诉它需要读取注册表?

编辑:

以下是从MSBuild任务执行的操作:

Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)
Run Code Online (Sandbox Code Playgroud)

我相信这是由我的Vista x64机器上的注册表重定向器在32位运行MSBuild引起的.是否有任何方法可以告诉自定义MSBuild任务(用VB .Net编写),HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\只有在没有任何内容的情况下查看然后查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\

谢谢,

斯科特蓝

registry msbuild msbuild-task

5
推荐指数
2
解决办法
3373
查看次数

在 c# 项目中使用 XSD Build 任务

如何在 ac# 项目中使用 c++ XSD 任务?我已经在 csproj 文件中创建了这样的任务:

  <Target Name="BeforeBuild">
    <XSD Namespace="$(RootNamespace).Xml" Language="CS" GenerateFromSchema="classes" Sources="Xml/schema.xsd" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

但是构建输出说,虽然智能感知在编辑项目文件时为我提供了 XSD 任务:

Error   1   The "XSD" task was not found. Check the following: 
1.) The name of the task in the project file is the same as the name of the task class. 
2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files …
Run Code Online (Sandbox Code Playgroud)

c# msbuild msbuild-task visual-studio-2010

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

msbuild自定义任务

我有一个自定义的MSBuild任务,它接受一组JavaScript文件,缩小它们并输出它们,扩展名为.min.js.当我通过Visual Studio进行正常构建时,它完美地工作,并且.min.js文件输出到与原始文件相同的目录.当我尝试使用Visual Studio中的"发布"功能进行部署时,只有原始.js文件才能进入发布目录....如何将我的任务输出计为"内容",以便它将结束在已发布的文件夹中?

编辑:我能够通过在我的任务中添加Output标签然后创建一个ItemGroup来解决这个问题:

<Target Name="AfterBuild">      
    <ItemGroup>
        <JavaScriptFiles Include="Scripts\*.js" Exclude="Scripts\*.min.js" />
    </ItemGroup>
    <JsCompress Files="@(JavaScriptFiles)" OutputPath="Scripts">
        <Output TaskParameter="CompressedFiles" ItemName="CompressedFiles" />
    </JsCompress>
    <ItemGroup>
        <Content Include="@(CompressedFiles)" />
    </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

msbuild publish msbuild-task visual-studio

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

MSBuild构建序列

看看MS的这篇文章,我有一个关于SolutionToBuild部分的问题.

<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\path\MySolution.sln />
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\scribble.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\HelloWorld\HelloWorld.sln" />
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

它表示构建的顺序由上面的顺序决定.因此,例如,MySolution将在涂鸦之前构建.

但是,如果涂鸦依赖于MySolution ,这是否安全?例如,MySolution输出scribble使用的一个或多个dll.如果MySolution和scribble同时更改,构建是否会等待MySolution完全编译后再转移到下一个项目?

msbuild msbuild-task

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

Cruise Control .Net异常编写msbuild-results.xml

我有一个在VM上运行构建的巡航控制服务器.我所做的只是将源控件从Perforce更改为Git,并且构建现在失败了.

CCNet配置

<tasks>
    <msbuild>
        <executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable>
        <workingDirectory>c:\Build\Pcp_Main</workingDirectory>
        <buildArgs>/v:d Pcp.proj /target:Clobber;Build /property:Configurations="Debug;Release" /property:NUnitRedirectConsoleOutput=1</buildArgs>
        <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MSBuild.dll</logger>
        <timeout>2700</timeout>
    </msbuild>
</tasks>
Run Code Online (Sandbox Code Playgroud)

构建日志

Done Building Project "c:\Build\Pcp_Main\Pcp.proj" (Clobber;Build target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:01:32.39
MSBUILD : error MSB4015: The build stopped unexpectedly because the "ReusableLogger"   logger failed unexpectedly during shutdown.
System.IO.DirectoryNotFoundException: Could not find a part of the path  'c:\Build\Pcp_Main\Artifacts\msbuild-results-2d082e8c-0e88-4c0b-9a6b-aa0e3094cab9.xml'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, …
Run Code Online (Sandbox Code Playgroud)

git cruisecontrol.net msbuild-task ccnet-config msbuild-4.0

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

将自定义属性添加到MSBuild任务

我让TeamCity为ASP.NET MVC 3应用程序运行MSBuild任务.现在每隔一段时间(看似随机)抛出"ASPNETCOMPILER:错误ASPRUNTIME:已经卸载了运行该线程的应用程序域." 它发生在MSBuild执行"MvcBuildViews"并运行aspnet_compiler.exe时.

现在我知道aspnet_compiler.exe(http://msdn.microsoft.com/en-us/library/ms229863 (vs.80 ) .aspx)有一个"-errorstack"开关可以给我一个关于这个的堆栈跟踪信息错误,但似乎AspNetCompiler Task没有暴露设置此属性的可能性(http://msdn.microsoft.com/en-us/library/ms164291.aspx).

所以我的问题是 - 有没有办法将任何自定义属性传递给现有的MSBuild任务,或者我必须在MSBuild之外手动运行aspnet_compiler.exe以启用-errorstack功能?

msbuild asp.net-mvc aspnet-compiler msbuild-task

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

MSBuild:为主项目生成XML文档,但不生成依赖项目

我有一个.sln文件,里面有几个项目.为了保持这个简单,我们称之为......

  • 项目A
  • 项目B
  • 项目C

...其中A是引用B和C的主项目.我的目标是更新我的构建脚本,为ProjectA生成XML"Intellisense"文档文件,而不提供有关B和C缺少文档的构建警告.

当前构建脚本

我有一个MSBuild脚本,在构建步骤中包含以下内容:

<PropertyGroup>
    <CustomOutputPath>C:\build\output\</CustomOutputPath>
</PropertyGroup>
<ItemGroup>
    <Projects Include="ProjectA\ProjectA.csproj">
        <Properties>OutputPath=$(CustomOutputPath)</Properties>
    </Projects>
</ItemGroup>
<MSBuild Projects="@(Projects)" />
Run Code Online (Sandbox Code Playgroud)

(ItemGroup中实际列出了多个项目,但同样,让我们​​保持这个简单.)

当我运行构建脚本时,它足够聪明,可以为我编译B,C和A,即使我只指定了A.所有输出都出现在"CustomOutputPath"位置.

我最接近的......

如果我将"DocumentationFile"属性添加到我的项目条目中......

<ItemGroup>
    <Projects Include="ProjectA\ProjectA.csproj">
        <Properties>OutputPath=$(CustomOutputPath);DocumentationFile=ProjectA.xml</Properties>
    </Projects>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

...然后'ProjectA.xml'出现在"CustomOutputPath"中.但是,我还在项目文件夹中为所有三个项目获取名为"ProjectA.xml"的文件:

  • 项目A/ProjectA.xml
  • 项目B/ProjectA.xml
  • 项目C/ProjectA.xml

这些文件包含各自项目的"Intellisense"文档,即使它们都被命名为"ProjectA.xml".

这会在项目文件夹中创建不受欢迎且误导性命名的文件,并且(更重要的是)为B和C中缺少的文档注释生成构建警告.我不想为这些项目添加文档注释,所以我更喜欢找到让MSBuild仅为ProjectA生成文档的方法.

任何人都可以提供任何见解或替代解决方案吗?

msbuild msbuild-task

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

MSBuild在"AL"任务中失败,错误代码为AL1019

我们在使用MSBuild编译解决方案时遇到了问题.构建在执行"AL.exe"链接器的任务"AL"内的资源链接步骤中随机构建失败.

ALINK : error AL1019: Metadata failure while creating assembly -- The volume for a file has been externally altered so that the opened file is no longer valid.
Run Code Online (Sandbox Code Playgroud)

构建日志显示以下执行流程.

4>Target "GenerateSatelliteAssemblies" in file "C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets" from project "C:\source\MyProject.csproj" (target "CreateSatelliteAssemblies" depends on it):
4>Building target "GenerateSatelliteAssemblies" completely.
4>Output file "obj\Debug\de\MyProject.dll" does not exist.
4>Task "MakeDir"
4>Done executing task "MakeDir".
4>Task "AL"
4>  C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\AL.exe /culture:de /out:obj\Debug\de\MyProject.resources.dll /template:obj\Debug\MyProject.dll /embed:obj\Debug\MyProject.SomeResource.de.resources
4>  Microsoft (R) Assembly Linker version …
Run Code Online (Sandbox Code Playgroud)

msbuild msbuild-task

5
推荐指数
0
解决办法
462
查看次数

如何将NuGet contentFiles提取到特定目录?

到目前为止,我已经尝试过:

我有以下.nuspec文件,用于定义我的程序包(为提高可读性而进行了简化):

<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
  .
  .
  .
    <dependencies/>
    <contentFiles>     
      <files include="any\any\config\*.*" buildAction="None" copyToOutput="true" flatten="false"/>
    </contentFiles>
  </metadata>
  <files>
    <file src="bin\Assembly.dll" target="lib\net461" />
    <file src="bin\Assembly.pdb" target="lib\net461" />
    <file src="Config\cf.xml" target="contentFiles\any\any\config"/>
    <file src="Config\cf.txt" target="contentFiles\any\any\config"/>
  </files>
</package>
Run Code Online (Sandbox Code Playgroud)

如您所见,它在子目录中包含一个已编译的Assembly及其调试符号文件以及两个内容文件

这将导致以下编译输出,其中Assembly.dll被提取到输出目录以及config子目录(其中包含两个cf. *文件):

实际构建输出


题:

我想要做的是将子目录配置在目录树中上移一个,因此它位于输出目录旁边 -基本上维护.nuspec文件中输入文件的结构(假设bin是目录的输出目录)我的.csproj):

nuspec目录结构 所需的构建输出

如何告诉NuGet程序包我要将contentFiles提取到的确切位置?

msbuild-task nuget nuget-package nuget-package-restore

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