我有一种情况,我想使用MSBuild将输出程序集从一个项目复制到我的目标应用程序的输出目录中,而不需要在MSBuild Copy任务中使用硬编码路径.这是场景:
还有一个Business层,但与我想要解决的MSBuild问题无关.
我的业务层有一个对我的Dal.Interface项目的引用.我的Web项目有一个对Business层的引用,并且就目前而言,执行构建会将业务层和Dal.Interface项目拉入输出.到现在为止还挺好.现在,为了运行Web应用程序,它需要Dal实现.我不想在任何地方引用实现,因为我想对接口强制执行编码而没有引用意味着它不会出现在intellisense等中.
所以我认为我可以通过MSBuild复制操作作为AfterBuild任务来处理这个问题(我在构建Web项目时构建了Dal实现设置,但没有引用).我不想在MSBuild参数中硬编码路径或其他任何东西,所以我试图弄清楚如何从Web应用程序项目的MSBuild文件中引用Dal项目的输出.
所以根据上面提到的项目,我想看到的是:
第3部分是我被困的地方.
我确信这可以做到,我只是找不到帮助的好参考.在此先感谢您的帮助.
我正在创建一个MSBuild任务,它将读取特定注册表项的注册表.如果我在控制台应用程序中编写相同的代码行(见下文),它将返回预期的结果,但是当它在MSBuild任务中时,它不返回任何内容.
Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)
Nothing如果键/值对不存在,我希望上面的代码返回,如果它存在,则返回值.我Nothing在MSBuild任务执行时得到了.是否有一些属性需要应用于MSBuild任务的Execute函数来告诉它需要读取注册表?  
编辑:
以下是从MSBuild任务执行的操作:
Return Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\", "SQLPath", Nothing)
我相信这是由我的Vista x64机器上的注册表重定向器在32位运行MSBuild引起的.是否有任何方法可以告诉自定义MSBuild任务(用VB .Net编写),HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\只有在没有任何内容的情况下查看然后查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSSQLServer\Setup\?
谢谢,
斯科特蓝
如何在 ac# 项目中使用 c++ XSD 任务?我已经在 csproj 文件中创建了这样的任务:
  <Target Name="BeforeBuild">
    <XSD Namespace="$(RootNamespace).Xml" Language="CS" GenerateFromSchema="classes" Sources="Xml/schema.xsd" />
  </Target>
但是构建输出说,虽然智能感知在编辑项目文件时为我提供了 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 …我有一个自定义的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>
看看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>
它表示构建的顺序由上面的顺序决定.因此,例如,MySolution将在涂鸦之前构建.
但是,如果涂鸦依赖于MySolution ,这是否安全?例如,MySolution输出scribble使用的一个或多个dll.如果MySolution和scribble同时更改,构建是否会等待MySolution完全编译后再转移到下一个项目?
我有一个在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>
构建日志
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, …我让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功能?
我有一个.sln文件,里面有几个项目.为了保持这个简单,我们称之为......
...其中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)" />
(ItemGroup中实际列出了多个项目,但同样,让我们保持这个简单.)
当我运行构建脚本时,它足够聪明,可以为我编译B,C和A,即使我只指定了A.所有输出都出现在"CustomOutputPath"位置.
如果我将"DocumentationFile"属性添加到我的项目条目中......
<ItemGroup>
    <Projects Include="ProjectA\ProjectA.csproj">
        <Properties>OutputPath=$(CustomOutputPath);DocumentationFile=ProjectA.xml</Properties>
    </Projects>
</ItemGroup>
...然后'ProjectA.xml'出现在"CustomOutputPath"中.但是,我还在项目文件夹中为所有三个项目获取名为"ProjectA.xml"的文件:
这些文件包含各自项目的"Intellisense"文档,即使它们都被命名为"ProjectA.xml".
这会在项目文件夹中创建不受欢迎且误导性命名的文件,并且(更重要的是)为B和C中缺少的文档注释生成构建警告.我不想为这些项目添加文档注释,所以我更喜欢找到让MSBuild仅为ProjectA生成文档的方法.
任何人都可以提供任何见解或替代解决方案吗?
我们在使用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.
构建日志显示以下执行流程.
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 …我有以下.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>
如您所见,它在子目录中包含一个已编译的Assembly及其调试符号文件以及两个内容文件。
这将导致以下编译输出,其中Assembly.dll被提取到输出目录以及config子目录(其中包含两个cf. *文件):
我想要做的是将子目录配置在目录树中上移一个,因此它位于输出目录旁边 -基本上维护.nuspec文件中输入文件的结构(假设bin是目录的输出目录)我的.csproj):
如何告诉NuGet程序包我要将contentFiles提取到的确切位置?
msbuild-task ×10
msbuild ×8
asp.net-mvc ×1
c# ×1
ccnet-config ×1
git ×1
msbuild-4.0 ×1
nuget ×1
publish ×1
registry ×1