Jon*_*ter 22 msbuild tfs team-build tfs2010
在我们的项目中,我们希望我们的TFS构建将每个项目放在drop文件夹下的自己的文件夹中,而不是将所有文件都放到一个平面结构中.为了说明,我们希望看到这样的事情:
DropFolder/
Foo/
foo.exe
Bar/
bar.dll
Baz
baz.dll
Run Code Online (Sandbox Code Playgroud)
这基本上与此处提出的问题相同,但现在我们正在使用基于工作流的构建,这些解决方案似乎不起作用.使用CustomizableOutDir属性的解决方案看起来对我们来说效果最好,但我无法识别该属性.我自定义了我们的工作流程,将其作为命令行参数传递给MSBuild(/ p:CustomizableOutDir = true),但似乎MSBuild只是忽略它并将输出放入工作流程给出的OutDir中.
我查看了构建日志,我可以看到CustomizableOutDir和OutDir属性都在命令行args中设置为MSBuild.我仍然需要传递OutDir,以便我可以在最后将我的文件复制到TeamBuildOutDir.
知道为什么我的CustomizableOutDir参数没有被识别,或者是否有更好的方法来实现这一点?
Jon*_*ter 14
我想出了一个很好的方法来做到这一点.事实证明,既然您可以将OutDir设置为工作流中的任何内容,那么如果将其设置为空字符串,MSBuild将使用特定于项目的OutputPath.这让我们变得更加灵活.这是我的整个解决方案(基于默认构建工作流程):
在"运行MSBuild"任务中,将OutDir设置为空字符串.在同一任务中,将CommandLineArguments设置为类似以下内容.这将允许您从项目中引用TFS默认OutDir:
String.Format("/p:CommonOutputPath=""{0}\\""", outputDirectory)
Run Code Online (Sandbox Code Playgroud)
在要复制到drop文件夹的每个项目中,设置OutputPath,如下所示:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath Condition=" '$(CommonOutputPath)'=='' ">bin\Release\</OutputPath>
<OutputPath Condition=" '$(CommonOutputPath)'!='' ">$(CommonOutputPath)YourProjectName\bin\Release\</OutputPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
检查所有内容,您应该有一个工作版本,将每个项目部署到drop文件夹下的自己的文件夹中.
我也解决了这个问题,我认为它比这个线程上的现有解决方案更清晰.
Run MSBuild for Project活动之前,我添加了一项Assign活动:projectName = Regex.Replace(New FileInfo(localProject).Name, "\.sln$", "").Create Directory活动:outputDirectory + "\" + projectNameOutDir到outputDirectory + "\" + projectName.模板已经填充了代理上构建localProject的.sln文件的完整路径名,例如c:\build\path\to\MySolution.sln.assign活动会切断路径和扩展,将输出放入MySolution.您需要创建projectName变量,然后导入System.Text.RegularExpressions和System.IO.
OP解决方案的优势在于您无需编辑每个.csproj解决方案,从解决方案文件的名称推断出该信息.
| 归档时间: |
|
| 查看次数: |
18962 次 |
| 最近记录: |