问题:
如果您将生成的 *.js 文件添加到 TFS,则 TFS 会对它们进行写保护,如果您将它们签入或不签出它们。因此,如果您更改 *.ts 文件,它无法生成 *.js 文件,因为该文件是写保护的。
==> 错误
但是,如果您不签入它们,那么在运行 deploy 时*.js 文件将会丢失。
==> 编译,但运行时错误
另外,如果您需要它作为嵌入式资源,则不能排除该文件...
附加问题1:
如果您运行“重建解决方案”,Visual Studio 想要在执行构建之前删除由 TypeScript 生成的 *.js 文件。
但无法删除,因为 *.js 文件是写保护的...
==> 错误
附加问题2:
由于 clean 不是“构建”,因此预构建事件不会在 clean 上执行...
因此,如果您删除了预构建的写保护,那么如果您执行“构建”,它将起作用,但如果您选择“重建”,它将失败,无论您是在解决方案中还是在项目中执行此操作。
附加题3:
您不能在项目设置编辑器中定义预清理事件命令。
所以,你可以这样做:
在您的打字稿 *.js 文件上运行 attrib -r /s(删除写保护)作为预构建操作。
例如
attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"
这行得通,因为 * 被扩展了:
- 如果文件不存在,则没有错误,因为没有命令
执行。
- 如果文件确实存在,则没有错误,命令为
执行。
如果您在文件名上运行它,如果该文件不存在,它将失败。
现在,您需要手动编辑项目文件 (*.csproj),以添加预清理操作。
pre-clean 操作与 pre-build 操作相同。
<Target Name="BeforeClean">
<!-- DO YOUR STUFF HERE -->
<Exec Command="attrib -r /s "$(ProjectDir)Resources/Scripts/0/*.js"" />
</Target>
然后就可以了。
现在您可以检查 *.js 文件,可以编辑 *.ts 文件(您需要取消保护 *.js 文件,或者之后运行构建)
如果你想在每个文件的基础上运行它,命令是:
if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)
或 XML 格式:
<Exec Command="if EXIST "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js" (
attrib -r "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
)" />
您还可以使用 TFS 命令行工具检查单个文件,而不是在预构建操作中删除只读属性:
"$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"
顺便说一句,您可以在此处找到 VisualStudio/MsBuild 宏的列表:
https://docs.microsoft.com/en-us/cpp/ide/common-macros-for-build-commands-and-properties?view=vs-2017
并找出宏的实际值:
- 在解决方案资源管理器中右键单击您的项目,选择属性
- 选择构建事件标签
- 点击 Edit pre-build 或 Edit post-build 按钮,都可以
- 在弹出的窗口中,点击宏按钮
- 向下滚动列表直到找到
ProjectDir,在下一个窗格中是它的实际值
此外,您可以将签出添加为 BeforeBuild-target 命令,而不是在项目中使用预构建事件。这样一来,如果他们在项目设置中将某些内容放入预构建中,任何人都不会意外删除它。
<Target Name="BeforeBuild">
<Exec Command=""$(DevEnvDir)CommonExtensions/Microsoft/TeamFoundation/Team Explorer/tf.exe" checkout /lock:none "$(ProjectDir)Resources/Scripts/0/leaflet.EasyAjax.js"" />
</Target>