我有一个使用配置转换的VS 2010解决方案,如下所示:
<Target Name="AfterBuild">
<TransformXml Condition="'$(IsDesktopBuild)' == 'false'" Source="Web.config" Transform="$(ProjectConfigTransformFileName)" Destination="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.config" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Debug.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Release.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Something.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<Delete Files="$(PublishDir)\_PublishedWebsites\$(ProjectName)\Web.Else.config" Condition="'$(IsDesktopBuild)' == 'false'" />
<AspNetCompiler Condition="('$(IsDesktopBuild)' != 'false') AND ('$(MvcBuildViews)'=='true')" VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
<AspNetCompiler Condition="('$(IsDesktopBuild)' == 'false') AND ('$(MvcBuildViews)'=='true')" VirtualPath="temp" PhysicalPath="$(PublishDir)\_PublishedWebsites\$(ProjectName)" />
</Target>
这是在.sln。
中的每个网站项目(.csproj)中当我使用/ p:PublishDir运行v 4.0 MSBuild时,一切都很好。但是当我使用默认模板(GitTemplate.xaml)将其作为构建定义运行时,文件夹由于某种原因解析为$(ProjectDir)
,而不是发布位置。所以转换目标正在尝试将文件复制到不存在的文件夹($(ProjectDir)\_PublishedWebsites\$(ProjectName)\Web.config
)。
如果我手动将/ p:PublishDir指定到磁盘上的STATIC位置,则构建成功。如何告诉MSBuild PublishDir实际上在哪里?
我很乐意编辑工作流以分配变量或其他内容,我只是不知道它是如何可能的。
我也尝试指定相对路径(例如/p:PublishDir="..\..\bin\\"
)和团队构建代理变量(与我们为构建路径配置的相同,例如/p:PublishDir="D:\$(BuildAgentId)\$(BuildDefinitionId)\bin\\"
)无济于事 - 似乎变量是没有打开,相对路径也不起作用。
答案 0 :(得分:1)
在AfterBuild目标之前添加类似的内容:
<PropertyGroup>
<PublishDir>PATH_TO_YOUR_PUBLISH_DIR</PublishDir>
</PropertyGroup>
您应该可以毫无问题地使用相对路径:
<PropertyGroup>
<PublishDir>..\..\bin\</PublishDir>
</PropertyGroup>
请记住,路径将相对于当前项目文件。
如果要从命令行覆盖它,可以添加如下条件:
<PropertyGroup>
<PublishDir Condition="'$(PublishDir)'==''">PATH_TO_YOUR_PUBLISH_DIR</PublishDir> <!-- This will be the default value -->
</PropertyGroup>
然后使用/ p调用MsBuild:PublishDir =&#34; Your_New_Path&#34;覆盖默认值。
如果您有VS解决方案,可以使用以下内容:
<PropertyGroup>
<PublishDir Condition="'$(PublishDir)'==''">$(SolutionDir)PublishDir</PublishDir> <!-- This will be the default value -->
</PropertyGroup>
这将使用以root身份放置解决方案的目录,并将创建一个&#34; PublishDir&#34;文件夹那里。
这只有在您有解决方案时才有效,当然您可以在没有解决方案的情况下定义默认值:
<PropertyGroup>
<SolutionDir Condition="'$(SolutionDir)'=='' Or '$(SolutionDir)'=='*Undefined*'">Your_Default_SolutionDir</SolutionDir>
<PublishDir Condition="'$(PublishDir)'==''">$(SolutionDir)PublishDir</PublishDir> <!-- This will be the default value -->
</PropertyGroup>